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