第一次调用时不显示动画

时间:2013-06-25 15:44:14

标签: iphone ios uianimation

我有一个简单的动画:

- (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];
}

那么为什么我单击它两次就会起作用呢?

2 个答案:

答案 0 :(得分:2)

当我执行UIAnimation并同时以编程方式添加UITableView时,我遇到了同样的问题。 UIView的框架发生了变化,但它不会在显示中更新。 要解决此问题,请使用

调用您的方法
  

块引用

-performSelector:withObject:afterDelay:延迟为0。

它将解决您的问题。

答案 1 :(得分:0)

如果您启用了自动布局,则可能需要警惕更改视图的frame。不幸的是,当重新应用约束时(由无数看似无害的动作触发,例如设置文本标签等),您的手动设置frame将被受约束限制的值替换。

你可能没有看到这个问题在你第二次调用这个例程时就会出现,因为你之后可能没有做任何事情导致重新应用约束。即使启用了自动布局,您也可以手动更改frame,但它会起作用,但只要重新应用约束,frame就可能会重置。

有两种解决方案:

  1. 如果使用自动布局,则可以设置约束常量的更改动画。有关如何为约束创建IBOutlet然后更改动画块中的constant属性的示例,请参阅this answer的后半部分。

  2. 您也可以直接停用自动布局。