导航栏导航项导致推视视图控制器上按钮的顶部区域不可点击

时间:2016-03-07 18:15:17

标签: ios uinavigationcontroller uibutton uinavigationbar uinavigationitem

我有一种强烈的感觉,这可能是苹果只需修复的Xcode错误。我有一个视图控制器作为根控制器嵌入在导航控制器中。视图控制器有一个与顶部布局指南垂直对齐的按钮。视图控制器的按钮工作正常,所有可点击的区域都在工作。

enter image description here

但是,如果我将相同或类似的视图控制器推到导航堆栈上,它的按钮将无法完全打开。按钮的顶部(大约10个像素左右)不再可以点击。如果我尝试点击按钮的左上角,则会轻触导航栏上的后退按钮,即使我显然没有点击导航栏边界。我认为这是苹果的一个错误,但我想知道是否有人知道修复。如果有人需要,这是link to the github project

2 个答案:

答案 0 :(得分:5)

这是iOS的默认行为。许多class MenuScene: SKScene { var menuView = UIView() let btn = UIButton(type: UIButtonType.Custom) as UIButton func someFunc() { btn.backgroundColor = UIColor.blueColor() btn.setTitle("Button", forState: UIControlState.Normal) btn.frame = CGRectMake(100, 100, 200, 100) btn.addTarget(self, action: "clickMe:", forControlEvents: UIControlEvents.TouchUpInside) self.menuview.addSubview(btn) } func clickMe(sender:UIButton!) { let scene = GameScene.unarchiveFromFile("GameScene") as! GameScene scene.scaleMode = SKSceneScaleMode.AspectFill view!.presentScene(scene) } } 在iOS中具有这种扩展的触摸功能。例如,UIViewUINavigationBarUITabBar等。我相信这是为了更轻松地触摸这些控件。

如果您仍想覆盖此默认行为。您可以通过继承UISecgmentedControl并在子类中添加此方法来完成此操作:

UINavigationBar

向您的Github project发出合并请求。

答案 1 :(得分:1)

如果有人需要,这里有一个快速版本的解决方案:

class CustomNavBar: UINavigationBar {

  override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
    if pointInside(point, withEvent: event) {
      userInteractionEnabled = true
    } else {
      userInteractionEnabled = false
    }

    return super.hitTest(point, withEvent: event)
  }
}

Swift 3 以及更高:

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