在我看来,这两个类方法是不可互换的。我有一个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 会被调用。这是怎么回事?
答案 0 :(得分:14)
默认情况下,iOS 4中的新动画块会禁用用户交互。您可以传入一个选项,允许视图在动画期间使用位标志和animateWithDuration:delay:options:animations:completion
UIView
方法一起响应触摸:
UIViewAnimationOptions options = UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction;
[UIView animateWithDuration:0.2 delay:0.0 options:options animations:^
{
highlightView.alpha = 1.0;
} completion:nil];
答案 1 :(得分:3)
还有一件事是Appple不建议使用[UIView beginAnimations:context:],你可以在beginAnimations
docs找到它
在iOS 4.0及更高版本中不鼓励使用此方法。你应该用 基于块的动画方法来指定你的动画。
可能Apple可能会在以后的版本中将旧方法标记为已弃用且不支持它们,因此使用基于块的方法实际上是执行动画的更好方法。