以前也有类似的问题,我提到了Capturing touches on a subview outside the frame of its superview using hitTest:withEvent:和Delivering touch events to a view outside the bounds of its parent view,但它们似乎没有回答我的特定问题。
我有一个自定义控件,其结构如下:
+-------------------------------+
| UIButton |
+-------------------------------+
| |
| |
| UITableView |
| |
| |
+------------------------- +
字符串
自定义控件覆盖UIButton
子类并添加UITableView
作为其子视图。其想法是让整个控件像一个按钮一样工作。当按下UIButton
时,UITableView
将按钮并启用选择选项。
如果控件是最顶层UIView
的直接子控件,则这一切都可以在UIButton
中覆盖,如上面Apple的Q&A链接中所述。但是,如果控件位于另一个视图层次结构中,则UITableView
不会接收触摸事件。
以下是使用的hitTest代码:
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
// Convert the point to the target view's coordinate system.
// The target view isn't necessarily the immediate subview
let pointForTargetView = self.spinnerTableView.convertPoint(point, fromView:self)
if (CGRectContainsPoint(self.spinnerTableView.bounds, pointForTargetView)) {
// The target view may have its view hierarchy,
// so call its hitTest method to return the right hit-test view
return self.spinnerTableView.hitTest(pointForTargetView, withEvent:event);
}
return super.hitTest(point, withEvent: event)
}
型
编辑:
我很抱歉没有能够看到答案,并检查他们是否解决了问题,由于一些其他的任务,需要立即注意.我会检查他们,并接受一个有帮助.感谢您的耐心.
6条答案
按热度按时间3phpmpom1#
正如你所说:
但是,如果控件位于另一个视图层次结构中,则可扩展视图不会接收触摸事件。
即使你让它工作,如果你在另一个UIView下子视图这个控件呢??
这样我们就有了为视图层次结构转换点的负担,我的建议是,正如你在this control中看到的那样,它将tableview添加到控件本身所在的同一层次结构上。(例如,它将tableview添加到添加此控件的控制器上)
链接的一部分:
字符串
希望有帮助!
w46czmvw2#
我认为你应该重写
pointInside
实现:字符串
像这样,superview调用控件的
hittest
,当触摸超出控件边界时,它不会返回nil。但是仍然有一个问题,如果控件在另一个视图层次结构中,则可扩展视图可能不会接收触摸事件。
我觉得这个问题很正常,你不能决定其他视图的pointInside是否在哪个控件之下,如果控件superview
hitTest
返回nil,控件hitTest
的方法就不会被调用。除非你覆盖了控件下所有的viewpointInside
方法,但这是不现实的。vkc1a9a23#
我在想
UIResponder
,类似于:字符串
如果此方法不起作用,请尝试使用superview
convertPoint
:当你确定
self.spinnerTableView
不为nil并且它是你的表时,做:型
nom7f22z4#
您需要子类UIView,并将其用作UIViewController的根视图。
字符串
7vux5j2d5#
你必须执行
字符串
为你的
UIButton
并检查UITableView
边界。因为hitTest
首先检查这个点击点是否在你的视图的边界内,然后为你的视图调用hitTest
。所以你必须实现pointInside
并为你的边界返回true。WWDC for advanced scroll views and touch handling techniques wwdc
pkmbmrz76#
解决方案Swift 5.2
你需要在UIView或按钮的超级视图中覆盖它。如果UIView是V,并且你将UIView V1或按钮B1放在V中,你需要将代码放在UIView V中。
字符串