我正在构建一个可以拖动和滑动的磁贴应用程序。目前,我将整个瓷砖块添加为子视图。我很好奇拖动 tile 元素的更好方法是什么,如果放置在另一个元素的顶部,则元素交换的位置坐标。
Swaps when placent A to B
View A <- -> View B
To
View B <- -> View A
我已经研究了触摸事件,但它基于任何视图。我也研究了 UIGestureRecognizer,但我想知道是否有任何好的框架可以处理这个问题,或者有什么更好的方法。
我正在构建一个可以拖动和滑动的磁贴应用程序。目前,我将整个瓷砖块添加为子视图。我很好奇拖动 tile 元素的更好方法是什么,如果放置在另一个元素的顶部,则元素交换的位置坐标。
Swaps when placent A to B
View A <- -> View B
To
View B <- -> View A
我已经研究了触摸事件,但它基于任何视图。我也研究了 UIGestureRecognizer,但我想知道是否有任何好的框架可以处理这个问题,或者有什么更好的方法。
您可以通过覆盖超级视图上的触摸事件来非常轻松地创建此系统。在触摸开始时找出被击中的子视图,在触摸移动时只需将其中心移动到触摸位置,在触摸结束时再次检查它被放置在哪个视图上并交换这两个视图。
你有很多方便的方法UIView
可以帮助你:pointInside
, convertPoint
, convertRect
. 你可能只需要pointInside
你的目的。
因此,在这种情况下,您应该设置userInteractionEnabled
为NO
瓷砖并在其超级视图中处理触摸。要进行命中检查,只需使用for
循环,pointInside
但在触摸结束时,您应该跳过对当前正在拖动的视图的检查。
编辑: UIPanGestureRecognizer 评论
UIPanGestureRecognizer
可能确实有效,尽管您从中受益甚少。您将能够立即获得它正在平移的视图,但仅此而已。您仍然需要通过类似for
循环的方式找到它结束的视图。手势的位置需要转换为超级视图坐标(如果没有,您将始终收到相同的坐标,因为您移动了视图本身)。缺点是您不会立即获得平移事件,您必须开始将视图拖动几个像素才能接收平移开始,另一方面您可能希望立即将视图拉到前面或做一些其他动画来通知用户此视图是可移动的。
无论如何,UIPanGestureRecognizer 是为平移而设计的。尽管可能将它用于您的目的,但您可能会发现自己在做更多的工作,而不是使用简单的触摸事件。
该[touches anyObject]
消息可能是您的不错选择
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self methodToChangeView];
}
用下面的方法
- (void)methodToChangeView {
MyNewViewController *myNewViewController = [[MyNewViewController alloc] initWithNibName:@"MyNewViewController" bundle:nil];
[self.navigationController pushViewController:myNewViewController animated:YES];
}