2011-09-18 62 views
6

Tôi đang cố gắng tạo hiệu ứng chỉ báo cho trường biểu mẫu trống vì vậy tôi đang sử dụng phương pháp bên dưới để tạo hiệu ứng cho một vị trí, đảo ngược hoạt ảnh và lặp lại. Trong giả lập này hoạt động tốt, trên 3GS của tôi có vẻ như có một nhấp nháy ngay khi khối hoàn thành được gọi. Chỉ báo này được hiển thị ngắn gọn ở vị trí giữa chứ không phải ở vị trí gốc.UIView hoạt ảnh nhấp nháy với autoreverse

Bất kỳ suy nghĩ nào về lý do điều này xảy ra? Cảm ơn.

- (void)bounceFormIndicator { 
    if (formIndicator.superview == nil) { 
     return; 
    } 

    int bounceDistance = 24; 

    [UIView animateWithDuration:0.6 
          delay:0 
         options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         CGRect indicatorFrame = formIndicator.frame; 
         indicatorFrame.origin.x += bounceDistance; 
         formIndicator.frame = indicatorFrame; 
        }completion:^(BOOL finished){ 
         CGRect indicatorFrame = formIndicator.frame; 
         indicatorFrame.origin.x -= bounceDistance; 
         formIndicator.frame = indicatorFrame; 
         [self bounceFormIndicator]; 
        }]; 
} 
+0

Vẫn chưa được giải quyết, nhưng tôi đã tìm được một công việc. Tôi sử dụng tùy chọn UIViewAnimationOptionRepeat và loại bỏ hoàn toàn khối hoàn thành. – brianpartridge

Trả lời

13

Tôi gặp vấn đề tương tự và đã đến Apple DTS để trợ giúp giải pháp.

Theo DTS, hiệu ứng 'nhấp nháy' này, hoặc hiệu ứng snap-back là hành vi mong đợi ... Tôi nghĩ rằng tôi đã làm điều gì đó sai với dự án của mình trong một thời gian dài.

Đặc biệt nó là cách này bởi vì các tiểu bang tài liệu, cho

UIViewAnimationOptionAutoreverse Chạy các hình ảnh động ngược trở lại và chuyển tiếp .

Phải được kết hợp với tùy chọn UIViewAnimationOptionRepeat.

Để tránh nhấp nháy, tôi phải làm 2 việc.

Triển khai của tôi là động, vì vậy bạn có thể không phải triển khai bước đầu tiên, nhưng tôi sẽ giữ nó ở đây chỉ để tham khảo.

Đầu tiên, tôi đã kiểm tra để xem nếu UIViewAnimationOptionAutoreverse là một phần trong những lựa chọn tôi sẽ đi vào hoạt hình của tôi, và UIViewAnimationOptionRepeatkhông ... Nếu như vậy, tôi lột nó từ các tùy chọn bằng cách thêm một dòng như:

animationOptions &= ~UIViewAnimationOptionAutoreverse; 

Để tạo hoạt ảnh đảo chiều không lặp lại, tôi đã thêm hoạt ảnh UIView đối diện làm khối hoàn thành của tôi. Tôi cũng đảo ngược sự nới lỏng định nếu nó là một trong hai UIViewAnimationOptionCurveEaseIn hoặc UIViewAnimationOptionCurveEaseOut ...

Mã từ dự án của tôi sau:

Những tuyên bố rằng dải tùy chọn autoreverse từ animationOptions của một đối tượng:

if ((animationOptions & AUTOREVERSE) == AUTOREVERSE) { 
    self.shouldAutoreverse = YES; 
    animationOptions &= ~AUTOREVERSE; 
} 

Một ví dụ về trình thiết lập thuộc tính bị ghi đè xử lý hoạt ảnh:

-(void)setCenter:(CGPoint)center { 
    CGPoint oldCenter = CGPointMake(self.center.x, self.center.y); 

    void (^animationBlock) (void) =^{ super.center = center; }; 
    void (^completionBlock) (BOOL) = nil; 

    BOOL animationShouldNotRepeat = (self.animationOptions & REPEAT) != REPEAT; 
    if(self.shouldAutoreverse && animationShouldNotRepeat) { 
     completionBlock =^(BOOL animationIsComplete) { 
      [self autoreverseAnimation:^ { super.center = oldCenter;}]; 
     }; 
    } 
    [self animateWithBlock:animationBlock completion:completionBlock]; 
} 

Phương pháp hoàn thành được gọi là trong t trường hợp đảo ngược mà không lặp lại:

-(void)autoreverseAnimation:(void (^)(void))animationBlock { 
     C4AnimationOptions autoreverseOptions = BEGINCURRENT; 
     if((self.animationOptions & LINEAR) == LINEAR) autoreverseOptions |= LINEAR; 
     else if((self.animationOptions & EASEIN) == EASEIN) autoreverseOptions |= EASEOUT; 
     else if((self.animationOptions & EASEOUT) == EASEOUT) autoreverseOptions |= EASEIN; 

     [UIView animateWithDuration:self.animationDuration 
           delay:0 
          options:autoreverseOptions 
         animations:animationBlock 
         completion:nil]; 
} 
Các vấn đề liên quan