[UIView beginAnimations:context:] 和 [UIView animateWithDuration:animations:] 之间的区别是什么?

12

在我看来,这两个类方法是不能互换的。我有一个UIView的子视图,在touchesBegan方法中使用以下代码:

if (!highlightView) {
    UIImageView *tempImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Highlight"]];
    self.highlightView = tempImageView;
    [tempImageView release];

    [self addSubview:highlightView];
}

highlightView.alpha = 0.0;

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
highlightView.alpha = 1.0;
[UIView commitAnimations];

我点击按钮时,高亮效果会出现,这是预期的行为。如果在动画完成前立即松开,我的touchesEnded方法就会被调用,这正是我想要的行为。

但是现在,我成了块的忠实粉丝,并尽可能地使用它们。因此,我用以下代码替换了UIView动画代码:

[UIView animateWithDuration:0.2 animations:^{    highlightView.alpha = 1.0;}];

结果:高亮仍按预期淡入,但如果在动画完成之前进行触摸,我的touchesEnded将不会被调用。如果我在动画完成后松开触摸,我的touchesEnded将被调用。这是怎么回事?


手指,抱歉。释放 = 触摸上升 - Rits
2个回答

14

iOS 4 中的新动画块默认情况下会禁用用户交互。你可以通过在 UIViewanimateWithDuration:delay:options:animations:completion 方法中使用位标志来传递选项,以允许视图在动画期间响应触摸事件:

UIViewAnimationOptions options = UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction;

[UIView animateWithDuration:0.2 delay:0.0 options:options animations:^
{
    highlightView.alpha = 1.0;
} completion:nil];

文档


刚刚编辑了我的回答——我认为除了空块以外,你也可以将 nil 作为 completion: 参数传递。 - BoltClock
如果您是使用iOS SDK 5构建应用程序,我认为这不再必要,但我并不完全确定。我会将我的答案留在这里,以供仍在为iOS 4部署的人参考。 - BoltClock
那么你的意思是说对于iOS 5+,这两者是等价的? - Crashalot

3

另外一件事是,苹果不推荐使用[UIView beginAnimations:context:],可以在beginAnimations文档中找到它。

iOS 4.0及更高版本中,不建议使用此方法。相反,你应该使用基于块的动画方法来指定你的动画。

可能苹果会在未来发布的版本中将旧方法标记为已弃用并不再支持它们,因此使用基于块的方法来执行动画确实更可取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接