使用Autolayout动画/移动视图

use*_*717 22 cocoa-touch ios autolayout

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

self.view.center = CGPointMake(100, 200);
Run Code Online (Sandbox Code Playgroud)

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

[self.view.superview setNeedsLayout];
Run Code Online (Sandbox Code Playgroud)

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

RJR*_*RJR 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;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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

    [UIView animateWithDuration:0.5 animations:^{
         [self.imageView layoutIfNeeded];
    }];
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

Come Back动作中,我们再次将常量重置为原始值,因此您可以看到橙色图像动画回原始位置.

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

    [UIView animateWithDuration:0.5 animations:^{
        [self.imageView layoutIfNeeded];
    }];
}
Run Code Online (Sandbox Code Playgroud)


Cli*_*ner 14

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