自定义导航栏不会在整个视图中接收触摸事件

时间:2017-07-17 21:30:20

标签: ios swift uinavigationbar

我正在尝试实施此image of my implementation

uilabel下面的三个按钮是可点击的。我有一个UIView作为我自定义导航栏视图的子视图,然后在该视图中有两个视图,一个是uilabel,第二个是uibuttons的uiview我

我尝试过其他答案的解决方案,例如

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    if self.point(inside: point, with: event) {
        self.isUserInteractionEnabled = true
    }else{
        self.isUserInteractionEnabled = false
    }
    return super.hitTest(point, with: event)
}

但那并没有奏效。我注意到如果我在默认uinavigation条尺寸位置附近的按钮上方点击,则会识别出水龙头。

如果有帮助,导航栏的大小为CGSize(width: self.frame.size.width, height: 100)

更新

只需添加我的自定义导航类及其用法

class CustomNavigationBar: UINavigationBar {
override func sizeThatFits(_ size: CGSize) -> CGSize {
    let newSize :CGSize = CGSize(width: self.frame.size.width, height: 100)
    return newSize
}

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    if self.point(inside: point, with: event) {
        self.isUserInteractionEnabled = true
    }else{
        self.isUserInteractionEnabled = false
    }
    return super.hitTest(point, with: event)
} 

}

    let navigationController = UINavigationController(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
    navigationController.setViewControllers([mainController], animated: false)

    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()

3 个答案:

答案 0 :(得分:1)

请检查导航栏高度是否增加,这将是停止导航栏完全交互的原因,添加以下代码并检查是否正常,

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    let height: CGFloat = 100 //whatever height you want
    let bounds = self.navigationController!.navigationBar.bounds
    self.navigationController?.navigationBar.frame = CGRect(x: 0, y: 0, width: bounds.width, height: bounds.height + height)

}

答案 1 :(得分:0)

您好,您应该仅在viewdidappear中更改导航栏框架,否则框架将不会生效。

self.navigationController?.navigationBar.frame = CGRect(x: 0, y: 0, width:width, height:  height)

答案 2 :(得分:0)

发现问题!

包含标题和按钮的视图设置了一个高度为60的框架,而不是我自定义导航栏的高度。谢谢你的帮助。

这里的课程是

设置导航栏的自定义高度后,确保它的子视图边界与导航栏的边界匹配。