条形按钮项目自定义视图未检测到UITapGesture

问题描述

我遇到了一些奇怪的行为,其中UIBarButtonItem.customView中的子视图没有触发tapGesture

private var leftBarButtonItem: UIBarButtonItem = {
    let b = UIBarButtonItem()
    return b
}()

private lazy var imageView: UIImageView = {
    let iv = UIImageView()
    //... some adicional setup
    iv.isUserInteractionEnabled = true
    return iv
}()


func setupBBItem() {
    let holderView = UIView()
    holderView.isUserInteractionEnabled = true
    
    holderView.addSubview(imageView)
    imageView.frame = //... some frame
    //... more setups here
    
    holderView.isUserInteractionEnabled = true
    
    
    leftBarButtonItem.customView = holderView
    navigationItem.leftBarButtonItem = leftBarButtonItem
    
    let gesture = UITapGestureRecognizer(target: self,action: #selector(someFunction))
    imageView.addGestureRecognizer(gesture)
}

@objc private func someFunction() {
    print("tap gesture detected")
}

我什至尝试将手势添加holderView上,但是结果是相同的,该函数从不触发。

在这里想念东西吗?

解决方法

问题是这一行:

let holderView = UIView()

这是一个零尺寸的视图。因此,它的子视图(图像视图)可以看到,但无法点击,因为视图的任何部分都在其超级视图之外,用户无法触摸。您需要为支架视图提供一些尺寸,使其至少与图像视图一样大。特别是必须对内部视图和图像视图使用内部自动布局约束执行此操作。这就是条形按钮项自定义视图的大小。