我有一种拖拉式应用程序。您可以在哪里选择图像并将其拖动到屏幕上的任何位置! 我遇到的问题是,当你移回另一个视图时,当我返回时,所有图像都会重置到中心。 例如,如果我按下按钮将我带到屏幕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];
}
答案 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事件期间,您将直接更新帧而不是依靠自动布局系统来执行此操作。