【问题标题】:Navigation Bar Navigation Items causing top area of buttons on pushed view controller to not be tappable导航栏导航项导致推送视图控制器上的按钮顶部区域不可点击
【发布时间】:2016-06-21 10:16:42
【问题描述】:

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

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

【问题讨论】:

  • 如果你的按钮可以再高一点,它可以是标签,或者你可以标签比按钮的标题低一点
  • 我实际上尝试过这样做。它没有完全起作用,因为顶部仍然覆盖了一些像素。

标签: ios uinavigationcontroller uibutton uinavigationbar uinavigationitem


【解决方案1】:

这是 iOS 的默认行为。许多UIViews 在iOS 中都有这种扩展的触摸功能。例如,UINavigationBarUITabBarUISecgmentedControl 等。我相信这是为了让这些控件更容易触摸。

如果您仍想覆盖此默认行为。您可以通过子类化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 project 发出合并请求。

【讨论】:

    【解决方案2】:

    这里有一个快速版本的解决方案,以防万一有人需要它:

    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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-06
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 2014-01-11
      • 2019-03-11
      相关资源
      最近更新 更多