当转到另一个视图时,UIimages移动到中心

时间:2012-11-19 20:08:20

标签: uiimage drag autolayout

我有一种拖拉式应用程序。您可以在哪里选择图像并将其拖动到屏幕上的任何位置! 我遇到的问题是,当你移回另一个视图时,当我返回时,所有图像都会重置到中心。 例如,如果我按下按钮将我带到屏幕2,则所有"拖动"我刚做的图像会移回中心。

仅当我启用了AUTOLAYOUT时才会发生这种情况:( 我的所有图片都是从中心开始的,所以我用autolayout猜测它的内容...

有什么想法吗?!

这是我的拖动图片代码的示例。

 - (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {

CGPoint translation = [recognizer translationInView:self.view];
recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                     recognizer.view.center.y + translation.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
}

1 个答案:

答案 0 :(得分:6)

您的拖放代码是通过改变view.center属性来手动配置布局。

启用自动布局后,自动布局负责设置布局,因此它负责设置view.center,view.bounds和view.frame(实际上只是从中心和边界计算)。

因此,一旦启用了自动布局,虽然您仍然可以手动设置view.center,但是下次计算满足您所具有的约束的布局时,自动布局将会破坏您所做的任何操作。

那么如何更新代码以使用自动布局?如果你想使用自动布局,你需要做的是修改你的handlePan:方法,这样它不会修改view.center,而是修改用于计算view.center的自动布局约束。具体细节取决于您的约束配置。但是,如果我们假设有一个NSLayoutContraint topSpaceConstraint将视图的顶部空间设置为superview,另一个NSLayoutConstraint leftSpaceConstraint将视图的左侧空间设置为superview,那么你可以产生与

相同的效果。
view.center = CGPointMake(view.center.x + translation.x,
                          view.center.y+ translation.y);

代替做

之类的事情
topSpaceConstraint.constant = topSpaceConstraint.constant + translation.y;
leftSpaceConstraint.constant = leftSpaceConstraint.consant + translation.x;
[view setNeedsLayout];
[view layoutIfNeeded];

前两行更新约束。最后两行导致自动布局系统重新计算结果帧并立即应用,而不是等到运行循环的下一轮。

或者,您可以在获得UIGestureRecognizerChanged事件时手动更新帧,然后只有在获得UIGestureRecognizerEnded事件后通过更新上面显示的约束才能使结果“永久”。这将是更高效的,因为在许多UIGestureRecognizerChanged事件期间,您将直接更新帧而不是依靠自动布局系统来执行此操作。