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 总是从顶部开始

UIView 动画在转换到新视图之前快速恢复到原始状态

应用程序总是从根活动重新开始,而不是恢复后台状态(已知错误)

旋转设备时,动画 uiview 切换回其原始状态

有没有办法从未完成的 UIView 动画中获取位置(或中心)状态?

如何在 UIView 内设置动画?