UIView 动画总是从当前状态开始
Posted
技术标签:
【中文标题】UIView 动画总是从当前状态开始【英文标题】:UIView animation always begins from current status 【发布时间】:2017-11-20 16:25:42 【问题描述】:@interface ViewController
@property(weak) IBOutlet UIView *blackView;
@end
(1) 首先我尝试使用动画块
- (IBAction) buttonHitted:(id)sender
[UIView beginAnimations: nil context: NULL];
[UIView setAnimationBeginsFromCurrentStatus: NO];
self.blackView.center = CGPointMake(UIScreen.mainScreen.bounds.size.width - self.blackView.center.x, self.blackView.center.y);
[UIView commitAnimations];
而且动画总是从当前状态开始,我不知道为什么很长时间。
(2)然后我尝试使用代码块,同样可悲。
- (IBAction) buttonHitted:(id)sender
[UIView animateWithDuration:2.0 delay:0.0 options:0
animations:^(void)
self.blackView.center = CGPointMake(UIScreen.mainScreen.bounds.size.width - self.blackView.center.x, self.blackView.center.y);
completion:nil];
//Options to 0, indicating that UIViewAnimationOptionBeginFromCurrentState not setted
我只是想知道为什么动画总是从当前状态开始。我检查了视图的属性,它总是当前动画的最后一个值。
【问题讨论】:
【参考方案1】:我想我找到了背后的原因。
属性动画(如 UIView_ins.center 和 CALayer_ins.transform)可以混合在一起,即使你只是改变了其中的一部分,比如 center.x
更重要的是,CAAnimation 必须将此属性设置为 YES,因此转换的默认 CAAction 也必须将此属性设置为 YES。
@property(getter=isAdditive) BOOL additive;
所以新动画不会覆盖飞行中的动画,而是将它们混合在一起。
为了确保将 UIView 动画选项更改为 UIViewAnimationOptionCurveLinear
- (IBAction) buttonHitted:(id)sender
[UIView animateWithDuration:3.0 delay:0.0
options:UIViewAnimationOptionCurveLinear
animations:^(void)
self.blackView.center = CGPointMake(UIScreen.mainScreen.bounds.size.width - self.blackView.center.x, self.blackView.center.y);
completion:nil];
你会看到可爱的 UIView 站在那里很久,什么也没做,那就是线性混合的象征:)
虽然使用默认的 EaseInOut 选项,但看起来像 setAnimationBeginsFromCurrentStatus:
的问题。
【讨论】:
以上是关于UIView 动画总是从当前状态开始的主要内容,如果未能解决你的问题,请参考以下文章
使用 jQuery 动画 scrollTop 总是从顶部开始
应用程序总是从根活动重新开始,而不是恢复后台状态(已知错误)