我有几个用户应该能够拖放的 UIView。我使用UIPanGestureRecognizer来管理 d&d 操作(参见下面的代码)。d&d 动作工作正常,但是当我开始拖动另一个 UIView 时,我刚刚放下的那个正在跳回原来的位置。
- (void)handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint translation = [recognizer translationInView:self.view];
switch (recognizer.state) {
case UIGestureRecognizerStateBegan:
for (UIView* checkView in dragAndDropImageViewsArray) {
if (checkView == recognizer.view) {
[checkView.superview bringSubviewToFront:checkView]; //this is done to make sure the currently dragged object is the top one
}
}
break;
case UIGestureRecognizerStateChanged:
recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y);
break;
case UIGestureRecognizerStateEnded:
NSLog(@"UIGestureRecognizerStateEnded");
break;
default:
break;
}
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
}
我尝试了一些“解决”问题但导致其他问题的方法:
- 取消自动布局:这完全解决了它,但现在我必须开始计算和管理不同设备和方向的对象位置和大小。
- 使用 layer.zPosition 而不是 bringSubviewToFront:这使得对象出现在其他对象之上,同时显然避免了“跳回”,但不允许我更改不同可拖动对象之间的层次结构。
我开始加深对自动布局的理解,但是当我觉得我要寻找的东西应该很简单时,它变得非常复杂;我看到了许多处理执行“重新自动布局”的方法,但我不清楚如何使用它们。
这里有一个简单的解决方案吗?就像调用一个方法来覆盖 IB 自动布局约束并根据 UIView 新位置重新定义它们?
任何帮助将不胜感激。