我有一个简单的动画:
- (void)showMenu
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelay:0.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
self.scrollView.frame = CGRectMake(296, -150, 432, 356);
[self.buttonMenu setImage:[UIImage imageNamed:@"menu_arrow_up.png"] forState:UIControlStateNormal];
[self.view bringSubviewToFront:self.scrollView];
[UIView commitAnimations];
}
第一次调用此动画时,只是我按钮的图像发生了变化, 我的滚动视图的位置不会改变。
在我调用showMenu
方法两次后,一切正常。
showMenu
。按钮的图像会发生变化。 scrollview
没有scrollview
没有showMenu
。按钮的图像会发生变化。 scrollview
更改的位置showmenu
第二种方法是closeMenu
:
- (void)closeMenu
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelay:0.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
self.scrollView.frame = CGRectMake(296, -317, 432, 356);
[self.buttonMenu setImage:[UIImage imageNamed:@"menu_arrow_down.png"] forState:UIControlStateNormal];
[UIView commitAnimations];
}
那么为什么我单击它两次就会起作用呢?
答案 0 :(得分:2)
当我执行UIAnimation并同时以编程方式添加UITableView时,我遇到了同样的问题。 UIView的框架发生了变化,但它不会在显示中更新。 要解决此问题,请使用
调用您的方法块引用
-performSelector:withObject:afterDelay:延迟为0。
它将解决您的问题。
答案 1 :(得分:0)
如果您启用了自动布局,则可能需要警惕更改视图的frame
。不幸的是,当重新应用约束时(由无数看似无害的动作触发,例如设置文本标签等),您的手动设置frame
将被受约束限制的值替换。
你可能没有看到这个问题在你第二次调用这个例程时就会出现,因为你之后可能没有做任何事情导致重新应用约束。即使启用了自动布局,您也可以手动更改frame
,但它会起作用,但只要重新应用约束,frame
就可能会重置。
有两种解决方案:
如果使用自动布局,则可以设置约束常量的更改动画。有关如何为约束创建IBOutlet
然后更改动画块中的constant
属性的示例,请参阅this answer的后半部分。
您也可以直接停用自动布局。