UIView动画iOS,奇异

时间:2013-04-02 10:40:05

标签: iphone ios objective-c uiview uiviewanimation

我可能做了一些非常愚蠢的事情,但我无法弄清楚为什么这不起作用。

我正在尝试执行简单的UIView块动画,但遇到了麻烦。我已经在一个测试项目中重新创建了。

我有一个视图控制器的视图,当我按下按钮时,我创建一个新视图并将其框架设置为超出当前视图(在它上面)。我想为转换设置动画,以便屏幕上当前的视图向下移出视图,因为它上方的新视图将取代它取代它。

这是连接到按钮的代码, 原始视图连接为self.view1

- (IBAction)buttonPressed:(id)sender {

    UIView *view2 = [[UIView alloc] init];
    view2.backgroundColor = [UIColor blueColor];
    float offScreenY = 0 - self.view1.frame.size.height;
    CGRect offScreenRect = CGRectMake(0, offScreenY, self.view1.frame.size.width, self.view1.frame.size.height);
    view2.frame = offScreenRect;
    [self.view addSubview:view2];

    float oldY = self.view1.frame.origin.y + self.view1.frame.size.height;
    CGRect oldRect = CGRectMake(0, oldY, self.view1.frame.size.width, self.view1.frame.size.height);

    [UIView animateWithDuration:0.5 animations:^{
        self.view1.frame = oldRect;
        view2.frame =  CGRectMake(0, 0, self.view1.frame.size.width, self.view1.frame.size.height);
    }];
}

这只会使view2向下动画,并且不会为视图1设置动画。

如果我不将视图2添加为子视图并且只将view1的帧更改放在动画块中,则view1会正确设置动画。

但他们不会一起工作!

为什么会这样?

2 个答案:

答案 0 :(得分:1)

这是打开自动布局的典型症状。如果您为frame设置动画,则可以使用,但是一旦autolayout重新应用视图上的约束,view1将返回其原始位置。通过添加view2,iOS会立即自动重新应用自动布局约束,因此view1将无法移动。

底线,不要使用autolayout并尝试直接为frame属性设置动画。两种解决方案:

  1. 简单的解决方案是关闭自动布局。转到IB,选择“文件检查器”并取消选中“使用Autolayout”按钮:

    enter image description here

  2. 如果您想继续自动布局,则不应通过直接更改frame属性来制作动画。您可以通过更改布局约束常量来设置动画。这已在S.O.的其他地方得到解答,但如果您需要有关该方法的指导,请告诉我。

    但基本的想法是为IBOutlet创建一个view1来调用view1TopConstraint,比如self.view1TopConstraint.constant += self.view1.frame.size.height; [self.view layoutIfNeeded]; ,然后在你的动画块中你可以说

    view1

    为了实现这个目的,你必须要小心view2上的其他约束(例如,有一个高度限制,没有底部约束,或者你有一个,降低其优先级等等) )。这可能是你第一次这样做时的麻烦,但你可以通过改变约束来快速掌握动画的内容。

    但是,如果您使用约束,那么您可能不应该通过其frame定义{{1}},但也可能定义约束。

答案 1 :(得分:0)

在这种情况下,最好有一个容器视图。

相应地在此容器中添加view1和view2。容器的某些部分将位于屏幕中,容器的框架大小将是视图大小的两倍。为容器设置动画,以便相应地动画其他两个视图..