导航栏导航项导致推送视图控制器上方按钮区域无法点击

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

enter image description here

然而,如果我将相同或类似的视图控制器推入导航栏堆栈中,它的按钮将无法完全点击。按钮顶部(大约10像素左右)不再可点击。如果我尝试在按钮左上角点击,即使我明显没有点击导航栏边界,也会触发导航栏上的返回按钮。我认为这是苹果的一个错误,但我想知道是否有人知道解决方法。这里是链接到github项目,如有需要请访问。

1
如果您可以将按钮的高度稍微增加一点,它就可以成为选项卡,或者您可以将其选项卡放置在按钮标题以下。 - Terence
我实际上尝试过这样做。但是它并没有完全成功,因为顶部仍然有一些像素被覆盖了。 - denvdancsk
2个回答

5
这是iOS的默认行为。许多UIView在iOS中具有此扩展触摸功能。例如,UINavigationBar、UITabBar、UISegmentedControl等。我认为这是为了更容易地触摸这些控件。
如果您仍想覆盖此默认行为。您可以通过对UINavigationBar进行子类化并在子类中添加此方法来实现:
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    if ([self pointInside:point withEvent:event]) {
        self.userInteractionEnabled = YES;
    } else {
        self.userInteractionEnabled = NO;
    }

    return [super hitTest:point withEvent:event];
}

有人向您的Github 项目发起了合并请求。


1
以下是快速解决方案的Swift版本,以防有人需要:
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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接