How can you add a UIGestureRecognizer to a UIBarButtonItem as in the common undo/redo UIPopoverController scheme on iPad apps?

后端 未结 15 1633
被撕碎了的回忆
被撕碎了的回忆 2020-12-07 12:36

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

15条回答
  •  孤街浪徒
    2020-12-07 12:52

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

提交回复
热议问题