我正在尝试将指示器设置为空表单字段的动画,因此我使用下面的方法设置动画到位置,反转动画,然后重复。在模拟器中,这工作正常,在我的3GS上,看起来在调用完成块时有一个闪烁。该指标简要显示在中间位置,而不是返回其原点。
有关为何发生这种情况的任何想法?感谢。
- (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 :(得分:13)
我遇到了同样的问题,并前往Apple DTS帮助解决了这个问题。
根据DTS,这种“闪烁”效果或快照效应是预期的行为......我认为我的项目在很长一段时间内都做错了。
特别是这样,因为文档说明了
UIViewAnimationOptionAutoreverse向后运行动画 前锋。
必须与UIViewAnimationOptionRepeat选项结合使用。
为了让闪烁消失,我不得不做两件事。
我的实现是动态的,所以你可能不需要实现第一步,但我会将它保留在这里仅供参考。
首先,我检查UIViewAnimationOptionAutoreverse
是否是我要传递给动画的选项的一部分,而UIViewAnimationOptionRepeat
不是 ...如果是,我通过添加如下行来从选项中删除它:
animationOptions &= ~UIViewAnimationOptionAutoreverse;
要创建反转动画而不重复,我添加了一个相反的UIView动画作为我的完成块。如果它是UIViewAnimationOptionCurveEaseIn
或UIViewAnimationOptionCurveEaseOut
...
我项目的代码如下:
从对象的animationOptions中剥离自动反转选项的语句:
if ((animationOptions & AUTOREVERSE) == AUTOREVERSE) {
self.shouldAutoreverse = YES;
animationOptions &= ~AUTOREVERSE;
}
处理动画的重写属性设置器的示例:
-(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];
}
在不进行反转的情况下要求完成方法:
-(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];
}