Problem
In my iPad app, I cannot attach a popover to a button bar item only after press-and-hold events. But this seems to be standard for
Ready for use UIBarButtonItem subclass:
@objc protocol BarButtonItemDelegate {
func longPress(in barButtonItem: BarButtonItem)
}
class BarButtonItem: UIBarButtonItem {
@IBOutlet weak var delegate: BarButtonItemDelegate?
private let button = UIButton(type: .system)
override init() {
super.init()
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
private func setup() {
let recognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(longPress)
)
button.addGestureRecognizer(recognizer)
button.setImage(image, for: .normal)
button.tintColor = tintColor
customView = button
}
override var action: Selector? {
set {
if let action = newValue {
button.addTarget(target, action: action, for: .touchUpInside)
}
}
get { return nil }
}
@objc private func longPress(sender: UILongPressGestureRecognizer) {
if sender.state == .began {
delegate?.longPress(in: self)
}
}
}