gpt4 book ai didi

objective-c - 使用 hitTest :withEvent: 捕获其父 View 框架之外的 subview 的触摸

转载 作者:IT老高 更新时间:2023-10-28 11:20:43 26 4
gpt4 key购买 nike

我的问题:我有一个 super View EditView 基本上占据了整个应用程序框架,还有一个 subview MenuView 只占用了底部 ~20%,然后 MenuView 包含它自己的 subview ButtonView 它实际上位于 MenuView 的边界之外(类似这样: ButtonView.frame.origin.y = -100).

(注意:EditView 有其他不属于 MenuView 的 View 层次结构的 subview ,但可能会影响答案。)

您可能已经知道这个问题:当 ButtonViewMenuView 的范围内时(或者,更具体地说,当我的触摸在 MenuView 内时> 的边界),ButtonView 响应触摸事件。当我的触摸超出 MenuView 的范围(但仍在 ButtonView 的范围内)时,ButtonView 不会收到任何触摸事件。

示例:

  • (E) 是 EditView,所有 View 的父级
  • (M)是MenuView,EditView的 subview
  • (B)是ButtonView,MenuView的 subview

图表:

+------------------------------+
|E |
| |
| |
| |
| |
|+-----+ |
||B | |
|+-----+ |
|+----------------------------+|
||M ||
|| ||
|+----------------------------+|
+------------------------------+

因为 (B) 在 (M) 的框架之外,所以 (B) 区域中的点击将永远不会发送到 (M) - 事实上, (M) 在这种情况下从不分析触摸,并且触摸被发送到层次结构中的下一个对象。

目标: 我认为重写 hitTest:withEvent: 可以解决这个问题,但我不明白具体如何。就我而言,应该在 EditView (我的“主” super View )中覆盖 hitTest:withEvent: 吗?还是应该在 MenuView 中覆盖它,即未接收触摸的按钮的直接父 View ?还是我想错了?

如果这需要一个冗长的解释,一个好的在线资源会很有帮助 - 除了 Apple 的 UIView 文档,我没有说清楚。

谢谢!

最佳答案

我已将接受的答案的代码修改为更通用 - 它处理 View 将 subview 剪辑到其边界的情况,可能被隐藏,更重要的是:如果 subview 是复杂的 View 层次结构,正确的 subview 将是返回。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

if (self.clipsToBounds) {
return nil;
}

if (self.hidden) {
return nil;
}

if (self.alpha == 0) {
return nil;
}

for (UIView *subview in self.subviews.reverseObjectEnumerator) {
CGPoint subPoint = [subview convertPoint:point fromView:self];
UIView *result = [subview hitTest:subPoint withEvent:event];

if (result) {
return result;
}
}

return nil;
}

SWIFT 3

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

if clipsToBounds || isHidden || alpha == 0 {
return nil
}

for subview in subviews.reversed() {
let subPoint = subview.convert(point, from: self)
if let result = subview.hitTest(subPoint, with: event) {
return result
}
}

return nil
}

我希望这可以帮助任何尝试将此解决方案用于更复杂用例的人。

关于objective-c - 使用 hitTest :withEvent: 捕获其父 View 框架之外的 subview 的触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11770743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com