iOS中的触摸事件

Posted

技术标签:

【中文标题】iOS中的触摸事件【英文标题】:Touch Event in iOS 【发布时间】:2013-06-12 06:18:14 【问题描述】:

我正在构建一个可以拖动和滑动的磁贴应用程序。目前,我将整个瓷砖块添加为子视图。我很好奇拖动 tile 元素的更好方法是什么,如果放置在另一个元素的顶部,则元素交换的位置坐标。

Swaps when placent A to B
View A <- -> View B 

To 

View B <- -> View A

我研究了触摸事件,但它基于任何视图。我也研究了 UIGestureRecognizer,但我想知道是否有任何好的框架可以处理这个问题,或者有什么更好的方法。

【问题讨论】:

【参考方案1】:

[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];

【讨论】:

【参考方案2】:

您可以通过覆盖超级视图上的触摸事件来非常轻松地创建此系统。触摸开始时找出被击中的子视图,触摸移动时只需将其中心移动到触摸位置,触摸结束时再次检查它被放置在哪个视图上并交换这两个视图。

UIView 上有许多方便的方法可以帮助您:pointInsideconvertPointconvertRect。您可能只需要 pointInside 即可。

所以在这种情况下,您应该将 userInteractionEnabled 设置为 NO 以用于瓷砖并在其父视图中处理触摸。要进行命中检查,只需使用for 循环和pointInside,但在触摸结束时,您应该跳过对当前正在拖动的视图的检查。

编辑: UIPanGestureRecognizer 评论

UIPanGestureRecognizer 可能确实有效,尽管您从中受益甚少。您将能够立即获得它正在平移的视图,但仅此而已。您仍然需要通过类似for 循环的方式找到它结束的视图。手势的位置需要转换为超级视图坐标(如果没有,您将始终收到相同的坐标,因为您移动了视图本身)。缺点是您不会立即获得平移事件,您必须开始将视图拖动几个像素才能接收平移开始,另一方面您可能希望立即将视图拉到前面或做一些其他动画来通知用户此视图是可移动的。

无论如何,UIPanGestureRecognizer 是为平移而设计的。虽然它可以用于您的目的,但您可能会发现自己做的工作比简单的触摸事件要多。

【讨论】:

感谢 Matic 和 aug2uag 的建议,但您是否认为 UIGestureRecognizerPan 会更有益,因为它会以不同方式用于每个视图?谢谢。

以上是关于iOS中的触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发之触摸事件

iOS中的触摸事件

说说iOS中的手势及触摸

添加触摸事件时iOS webview中的内存泄漏

触摸事件

iOS/Mobile Safari 是不是支持 HTML 图像映射中的触摸事件