使用Autolayout动画/移动视图

时间:2012-12-06 13:46:53

标签: ios cocoa-touch autolayout

我想将视图从一个位置移动到另一个位置,我可以使用

实现它
self.view.center = CGPointMake(100, 200);

但是,如果项目使用的是Autolayout,则视图将在运行后返回到原始位置:

[self.view.superview setNeedsLayout];

然后如何将视图实际移动到新位置?

2 个答案:

答案 0 :(得分:32)

启用AutoLayout后,我们应FORGET FRAMES且仅CONSIDER CONSTRAINTS。是的,对于动画,您也无法再更改框架或中心,视图将恢复到其原始位置时布局被称为。

相反,您应该consider changing the constant value of the constraint获得相同的效果。

考虑一个用户界面,如下面给出的图像。我有一个带有20 points leading space from it's superview的图像视图,这意味着它有一个水平空间约束及其superview.Also我还有三个附加到该图像视图的约束,顶部,宽度和高度。

我将向您展示如何从左到右为图像设置动画,如图所示。

为我们需要动画的约束创建IBOutlet。这里我们只采用水平空间约束,这足以将此视图从左向右移动。

@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *horizontalSpaceConstraint;

enter image description here

Go Away内部操作中,我们需要更新此约束的常量值。

- (IBAction)moveFrontAction:(id)sender {
    self.horizontalSpaceConstraint.constant = 220;

    [UIView animateWithDuration:0.5 animations:^{
         [self.imageView layoutIfNeeded];
    }];
}

现在应该将视图移动到右端。我只是在动画块中执行此操作,因此我们将能够从左到右看到一个漂亮的动画,反之亦然。在制作中,我们不应该硬编码像这样的价值。这里只是为了使概念清晰。

enter image description here

Come Back操作中,我们再次将常量重置为原始值,这样您就可以看到橙色图像动画回原始位置。

- (IBAction)moveBackAction:(id)sender {
    self.horizontalSpaceConstraint.constant = 20;

    [UIView animateWithDuration:0.5 animations:^{
        [self.imageView layoutIfNeeded];
    }];
}

答案 1 :(得分:14)

如果使用autoLayout,则必须更改约束。建议的方法是在约束的视图控制器中创建一个出口,然后更改约束的常量。如果你有时间我肯定会推荐going here并观看“按示例自动布局”或“掌握自动布局的最佳实践”。他们帮了我很多忙。我想要带走的是,使用autoLayout,你不再考虑帧。因此设置中心不适用于自动布局。这完全取决于观点如何相互关联。