UIView 动画忽略持续时间

Posted

技术标签:

【中文标题】UIView 动画忽略持续时间【英文标题】:UIView animation ignores duration 【发布时间】:2013-07-16 15:44:07 【问题描述】:

我正在尝试在 UIView 子类的其中一个子视图上执行动画。

动画持续时间忽略我尝试将其设置为的任何值,并且只会在大约 2 秒的永久持续时间上执行。 finished 标志返回 True。

[UIView animateWithDuration:0.5f animations:^
    img.frame = newFrame;
 completion:^(BOOL finished) 
    NSLog(@"result: %d", finished);
];

当我使用旧方法时,它可以正常工作:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5f];
img.frame = newIconRectFinal;
[UIView commitAnimations];

可能是什么问题?

【问题讨论】:

我将您的代码复制到 UIView 子类中,并对图像视图的框架进行了动画处理——它可以正常工作,所以我认为问题不在于您发布的代码。跨度> 你是否有另一个动画块同时运行/封装了这个块? @Wain,你是对的!我确实不小心封装了 2 个动画。奇怪的是,旧的动画风格效果很好,不是吗? @Wain,无论如何,请把你的评论作为答案,这样我就可以给你信用:) 【参考方案1】:

您可能将动画封装在另一个动画中,并且两个动画都使用了它的持续时间。

【讨论】:

如果是这种情况我们该怎么办? 更改嵌套,最好是通过设计,最坏的情况是通过推送“内部”动画,以便在运行循环的下一次迭代中创建它 但是先生,我在 cellForRowAtIndexPath 中运行它,这是我在那里唯一的动画 那么您要设置动画的视图尚未出现在屏幕上,请查看显示委托方法或滚动委托方法(并可能提出一个新问题,并提供问题的具体细节)跨度> 【参考方案2】:

在开始动画之前使用这行代码写这行代码。

[UIView setAnimationsEnabled:YES];

请参阅下面的代码,它将起作用。现在它不会忽略持续时间

-(void)doAnimation
 
   view2=(UIView*)[self.view viewWithTag:100];
   UIView setAnimationsEnabled:YES];
   [UIView animateWithDuration:3.0 animations:^       
    view2.frame=CGRectMake(0, 30, 1024,768);
    view2.alpha=1.0       
     completion:^(BOOL finished)  
     view2.frame=CGRectMake(0, 0, 1024,768);
       view2.alpha=0.0 
    [weakSelf doAnimation];  
      ];
   

【讨论】:

以上是关于UIView 动画忽略持续时间的主要内容,如果未能解决你的问题,请参考以下文章

UIView 动画立即完成,不考虑持续时间或延迟

SwiftUI onAppear:动画持续时间被忽略

核心动画立即调用完成函数

iOS - UIView 动画的限制?

在 iOS 版 Google 地图中控制动画持续时间

iOS UIView 动画浅谈