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à UIViewAnimationOptionRepeat
khô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];
}
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