我想将视图从一个位置移动到另一个位置,我可以使用
实现它self.view.center = CGPointMake(100, 200);
但是,如果项目使用的是Autolayout,则视图将在运行后返回到原始位置:
[self.view.superview setNeedsLayout];
然后如何将视图实际移动到新位置?
答案 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;
在Go Away
内部操作中,我们需要更新此约束的常量值。
- (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];
}];
}
答案 1 :(得分:14)
如果使用autoLayout,则必须更改约束。建议的方法是在约束的视图控制器中创建一个出口,然后更改约束的常量。如果你有时间我肯定会推荐going here并观看“按示例自动布局”或“掌握自动布局的最佳实践”。他们帮了我很多忙。我想要带走的是,使用autoLayout,你不再考虑帧。因此设置中心不适用于自动布局。这完全取决于观点如何相互关联。