2012-12-06 83 views
21

的使用移动的观点我想从一个现在的位置是移动视图到另一个,我可以用动画效果/下自动布局

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

,实现它但如果该项目使用自动布局,那么该视图会回来运行后的原始位置:

[self.view.superview setNeedsLayout]; 

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

回答

14

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

+0

听起来好像是使用自动布局比使用框架移动视图,因为我应该得到这个观点 – user1687717

+0

这是第一难的所有出口困难,但其实我开始喜欢它更好。你可以做更多的事情 –

+0

Second @ClintWarner在这里:Autolayout最初可能需要花费更多的努力,但是它在维护和可读性方面付出了巨大的红利。现在我习惯于实施约束,使用框架数学似乎很乏味和令人沮丧。 – followben

31

随着AutoLayout启用,我们应该FORGET FRAMES只有CONSIDER CONSTRAINTS。没错,对于动画也可以不再更改框架或中心,鉴于公司将恢复到原来的位置布局时被调用。

相反,你应该consider changing the constant value of the constraint得到同样的效果。

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

我会告诉你我们如何能够从左至右动画图像如图所示的形象。

IBOutlet中创建的,因为我们需要animate.Here约束的,我们只取水平空间的限制,就足以移动从左至右这一观点。

@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]; 
    }]; 
} 

现在认为应移至右边end.I'm只是做一个动画块内,所以我们就能看到一个漂亮的动画从左至右,副versa.In生产,我们不应该像这样硬编码这些值。只要在这里做这个概念就可以清楚了。

enter image description here

里面的Come Back行动,我们再次重新定回它的原始值,所以你可以看到橙色的图像动画回到原来的位置。

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

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

谢谢你解决了我的问题。 – jdog

+0

嗨user1687717想要使用视图的不使用动画样式的触摸方法滚动视图。 –

+1

在更改约束常量之前,最好调用'[self.imageView layoutIfNeeded]'。这里它没有任何影响,但在真实项目中可能有其他动画。所以你的imageview必须在动画之前显示你的最终框架.-(IBAction)moveBackAction:(id)sender {self.imageView layoutIfNeeded]; self.horizo​​ntalSpaceConstraint.constant = 20; [UIView animateWithDuration:0.5动画:^ {self.imageView layoutIfNeeded]; }]; }' –