UIView子视图UIButton对触摸没有响应



我在UIView子视图中有一个UIButton。视图显示良好,但按钮对触摸没有响应。子视图是嵌入到容器视图中的两个独立的ViewControllers。

在情节提要上,所有视图、控制器和按钮都启用了用户交互。我还以编程方式启用了子视图的用户交互。

这是代码:

@IBOutlet var showtimeView: UIView!
@IBOutlet var reviewView: UIView!
var viewTwo: UIView!
var viewThree: UIView!
override func viewDidLoad() {
super.viewDidLoad()
viewTwo = ShowtimesView().view
showtimeView.addSubview(viewTwo)
viewThree = ReviewsView().view
reviewView.addSubview(viewThree)
showtimeView.isUserInteractionEnabled = true
reviewView.isUserInteractionEnabled = true
viewTwo.isUserInteractionEnabled = true
viewThree.isUserInteractionEnabled = true

}
@IBAction func segmentChange(_ sender: Any) {
switch(segment.selectedSegmentIndex) {
case 0:
detailsView.isHidden = false
showtimeView.isHidden = true
reviewView.isHidden = true
break
case 1:
detailsView.isHidden = true
showtimeView.isHidden = false
reviewView.isHidden = true
break
case 2:
detailsView.isHidden = true
showtimeView.isHidden = true
reviewView.isHidden = false
break
default:
break
}
}

还有什么可以阻止位于子视图内部的UIButton对触摸做出响应?

编辑:我更改了容器的颜色,以检查它是否覆盖了视图控制器。容器没有显示在子视图视图控制器的前面。子视图仍然不响应触摸。

如果按钮顶部有另一个视图,例如容器视图和该容器视图中的视图(以及覆盖按钮的容器视图的任何其他视图(,则触摸事件不会到达该按钮。

为了补偿,让容器视图(覆盖您的按钮(和其中的视图都源自以下视图:

class PassthroughView: UIView
{
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?
{
let view = super.hitTest(point, with: event)
return view == self ? nil : view
}
}

您可以直接在故事板中为这两个视图从UIView更改为PassthroughView,只需将上面的类放在某个地方(我更喜欢它在自己的文件中(。

解决方案是删除viewDidLoad中的代码。由于视图已经通过情节提要片段嵌入到容器视图中,因此不需要创建为子视图。

最新更新