我有一个 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/