ios - 如何检测拖到那里的 subview 中的触摸(或获取哪个 subview 在其父 View 中点击下方的最快方法)

标签 ios iphone cocoa-touch uiview

我有一个 super View ,它有一堆 subview 。我希望用户能够在 super View 内拖动他们的手指,当他们拖动到 subview 上时,该 subview 会发生变化。

我需要它非常高效,因为变化可以非常快地发生。

到目前为止,我已经尝试过,在 super View 中,我可以从touchesBegan:withEvent: 和touchesMoved:withEvent: 获取触摸事件,这两个组合为我提供了我需要的所有触摸。每次调用这些方法时,我都必须遍历所有 subview 并像这样进行测试

for (UIView *view in self.subviews) {
    if (CGRectContainsPoint(view.frame, touchPoint) {
        return view;
    }
}

然后按照我想要的方式更改该 View 。问题是,从我的基准测试来看,这个过程只有两个慢。

我的直接想法是让 subview 本身检测触摸,然后在点击它们时发布通知或类似的内容。这样我就不必在每次异常触摸事件时都在 super View 中遍历它们。

我遇到的问题是,我还没有找到一种方法让 subview 本身检测到它们在被拖动时被触摸,并且触摸实际上源自不同的 UIView。

我乐于接受任何可以加快第一个过程或以不同的方式完成此过程的建议。

最佳答案

由于您的 subview 位于网格上,并且如果它们的大小相同,您应该能够直接计算突出显示的 View 。您只需要将它们在创建时的引用存储在二维数组中,为了提高性能,我建议使用 c 数组。

int x = touchPoint.x/viewWidth;
int y = touchPoint.y/viewHeight;
return views[x][y];

根据您的布局,应考虑一些边框边距或 View 之间的间距。

这样您就不需要迭代 subview 数组,也不需要执行所有这些 CGRectContainsPoint 计算。

关于ios - 如何检测拖到那里的 subview 中的触摸(或获取哪个 subview 在其父 View 中点击下方的最快方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24540133/

相关文章:

iphone - 如何摆脱粘滞的 iPad 启动画面?

ios - 不同图像方向和宽高比的 CollectionView 布局?

Iphone 设备 token - NSData 或 NSString

ios - 使用facebook登录IOS延迟查找用户的电子邮件

ios - 下拉UIViewController暴露一个输入框(文本输入)

iphone - cocoa touch : How to add a subview that is centered horizontally in its parent view?

ios - 如何在 NSMutableDictionary 中添加对象

ios - NSString 中的字符编码转为 unicode 字符

ios - Xamarin 检测文本字段的程序更改

iphone - 如何让 UIPickerView 在屏幕上滑动一半?