UIView 动画 iOS,诡异

Posted

技术标签:

【中文标题】UIView 动画 iOS,诡异【英文标题】:UIView animation iOS, Bizzarre 【发布时间】:2013-04-02 10:40:04 【问题描述】:

我可能在做一些非常愚蠢的事情,但我不知道为什么这不起作用。

我正在尝试执行一个简单的 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 向下而不是动画 view 1。

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

但他们不会一起工作!

这是为什么?

【问题讨论】:

这可能是因为 oldRect 与 self.view1.frame 相同。打印两个值,你会看到发生了什么 尝试了完全相同的代码,它在这里工作正常。一定还有其他你没有在这里展示的东西...... 【参考方案1】:

这是开启自动布局的典型症状。如果您为frame 设置动画,它可以工作,但是一旦自动布局重新应用视图上的约束,view1 将返回到其原始位置。通过添加view2ios 会立即自动重新应用自动布局约束,因此您的view1 不会移动。

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

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

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

    不过,基本想法是为 view1 的顶部约束创建一个 IBOutlet,例如,view1TopConstraint,然后在动画块中您可以说

    self.view1TopConstraint.constant += self.view1.frame.size.height;
    [self.view layoutIfNeeded];
    

    但是,要使其正常工作,您必须注意对 view1 的其他限制(例如,有高度限制,没有底部限制,或者如果有,请降低其优先级等) .第一次这样做可能会很麻烦,但通过更改约束,您很快就会掌握动画制作的窍门。

    但是,话又说回来,如果您使用约束,您可能不应该通过它的 frame 定义 view2,但可能也为此定义约束。

【讨论】:

罗布,谢谢你的回答。你是对的,限制是前进的方向“滑冰球的去向”等。感谢您的回答。去刷一下我的自动布局!【参考方案2】:

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

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

【讨论】:

谢谢,这就是我最终所做的,所以我将其标记为正确

以上是关于UIView 动画 iOS,诡异的主要内容,如果未能解决你的问题,请参考以下文章

ios 动画学习(-)UIView 自带动画

iOS开发UI篇—核心动画(UIView封装动画)

ios uiview封装动画(摘录)

iOS动画:UIView动画和CALayer动画(CABasicAnimationCAKeyframeAnimation的使用)

iOS开发UI篇—核心动画(UIView封装动画)

ios之UIview动画