22

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

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

但是,如果项目使用了 Autolayout,那么运行后视图会回到原来的位置:

[self.view.superview setNeedsLayout];

那么如何实际将视图移动到新位置?

4

2 回答 2

32

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

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

考虑如下图所示的用户界面。我有一个带有 a 的图像视图,20 points leading space from it's superview这意味着它的超级视图具有水平空间约束。此外,我还有三个附加到该图像视图的约束,顶部、宽度和高度。

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

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

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

在此处输入图像描述

Go Awayaction 内部,我们需要更新这个约束的常量值。

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

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

现在视图应该移动到右端。我只是在一个动画块内这样做,所以我们将能够从左到右看到一个漂亮的动画,反之亦然。在生产中,我们不应该硬编码像这样的值这个。只是在这里做是为了让这个概念更清楚。

在此处输入图像描述

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

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

    [UIView animateWithDuration:0.5 animations:^{
        [self.imageView layoutIfNeeded];
    }];
}
于 2013-11-12T07:23:20.763 回答
14

如果您使用自动布局,则必须更改约束。建议的方法是在约束的视图控制器中创建一个出口,然后更改约束的常量。如果你有时间,我肯定会推荐去这里观看“Auto Layout by Example”或“Best Practices for Mastering Auto Layout”。他们帮了我很多。我想要带走的一点是,使用自动布局,您不再考虑框架。因此,设置中心不适用于自动布局。这都是关于视图如何相互关联的。

于 2012-12-06T14:30:02.377 回答