2

我有一个简单的动画:

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

那么为什么只有当我单击它两次时它才起作用?

4

2 回答 2

3

当我执行 aUIAnimation并同时以UITableView编程方式添加 a 时,我遇到了同样的问题。更改的框架,UIView但不会在显示中更新。

performSelector:withObject:afterDelay:要解决此问题,请使用延迟为 0的方法调用您的方法。

于 2015-06-02T06:46:52.830 回答
0

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

第二次调用此例程时,您可能没有看到此问题出现,因为此后您可能没有立即执行任何导致重新应用约束的操作。即使启用了自动布局,您有时也可以frame手动更改,它会起作用,但一旦重新应用约束,frame可能会重置。

有两种解决方案:

  1. 如果使用自动布局,您可以动画约束常量的变化。有关如何创建for 约束然后更改动画块中的属性的示例,请参阅此答案的后半部分。IBOutletconstant

  2. 您也可以简单地禁用自动布局。

于 2013-06-26T06:37:44.917 回答