2

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

这只发生在我启用自动布局时:(我所有的图像都从中心开始,所以我猜测它与自动布局有关......

有任何想法吗 ?!

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

 - (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];
}
4

1 回答 1

6

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

启用自动布局后,自动布局负责设置布局,因此它专门负责设置 view.center、view.bounds 和 view.frame(实际上只是从 center 和 bounds 计算出来的)。

因此,一旦启用了自动布局,尽管您仍然可以手动设置 view.center,但自动布局将在下次计算满足您现有约束的布局时破坏您所做的任何事情。

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

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 事件期间,您将直接更新框架,而不是依赖自动布局系统来完成。

于 2012-11-24T14:47:32.450 回答