添加UITabbar时UIButton不可点击

Posted

技术标签:

【中文标题】添加UITabbar时UIButton不可点击【英文标题】:UIButton Not Clickable when added UITabbar 【发布时间】:2021-01-28 17:47:31 【问题描述】:

当UITabbar上的UIButton添加到中间时如图。 UITabBar上方的按钮动作无法点击

func setupMiddleButton() 
    plusButton = UIButton(frame: CGRect(x: 0, y: 0, width: 64, height: 64))
    
    var menuButtonFrame = plusButton.frame
    menuButtonFrame.origin.x = tabBar.bounds.width/2 - menuButtonFrame.size.width/2
    
    let hasNotched :Bool? = UIDevice.current.hasNotch

    if hasNotched != nil 
        menuButtonFrame.origin.y = tabBar.bounds.height - menuButtonFrame.height - 15
     else 
        menuButtonFrame.origin.y = tabBar.bounds.height - menuButtonFrame.height - 50
    
    
    plusButton.frame = menuButtonFrame
    plusButton.setTitle("+", for: .normal)
    plusButton.titleLabel?.font = UIFont.helveticaNeue(ofSize: 40)
    plusButton.backgroundColor = UIColor.init(hexString: "5E71FE")
    plusButton.titleEdgeInsets = UIEdgeInsets(top: 0,left: 10,bottom: 10,right: 10)
    tabBar.addSubview(plusButton)

    plusButton.layer.cornerRadius = menuButtonFrame.height/2
    plusButton.addTarget(self, action: #selector(plusButtonAction(sender:)), for: .touchUpInside)
    

【问题讨论】:

它是不可点击的,因为它的顶部在你的 UITabBar 的框架之外,或者可见但不能与用户交互。您需要将此按钮移到 UITabBar 之外 @Pancho 是否有任何自定义 TabBar 控制器可用于此类行为? 【参考方案1】:

您需要像这样覆盖自定义标签栏类中的 hitTest 方法

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? 

    guard !clipsToBounds && !isHidden && alpha > 0 else  return nil 

    for member in subviews.reversed() 
    
            let subPoint = member.convert(point, from: self)
            guard let result = member.hitTest(subPoint, with: event) 
            else  continue 
            return result
    

    return nil

基本上问题是上部不可点击,因为它超出了标签栏的主要内容视图的范围。

此方法将检查点击是否在视图的边界内,如果是,它将返回视图并调用该按钮的操作。

苹果文档:Link

P.s 我最近遇到了同样的问题,得到了这个帮助,效果很好。

【讨论】:

【参考方案2】:

我怀疑您尝试做的事情是不可能的,或者至少,Apple 不支持。 (因此不推荐,因为您可能会找到一种方法让它今天可以工作,但在未来的某些操作系统版本中不会。)

通常,Apple 不支持您将自定义视图对象添加到系统组件,如标签栏、导航栏、堆栈视图、表格/集合视图控制器等,除非通过文档化 API。

我建议不要做你想做的事。相反,在标签栏控制器的内容视图中添加一个按钮。我不知道您是否能够像您尝试做的那样使其部分覆盖标签栏。

【讨论】:

以上是关于添加UITabbar时UIButton不可点击的主要内容,如果未能解决你的问题,请参考以下文章

将 UIButton 放置在与 UITabBar 相同的空间中(隐藏时)

UItableView Cell上的UIbutton不可点击

UIButton 在 ScrollView 上不可点击

UITableViewCell 中的 UIButton 不可点击

从类实现时 UIButton 不可点击

更改应用程序主题时更改 UITabbar?