适配iPad的M1 Mac上TrackPad右键与鼠标右键点击失效排查
问题排查:Mac端iPad适配应用的右键/触控板副点击无响应问题
我们的应用需要在以下点击操作时弹出菜单:
- TrackPad单指Primary click(主点击)
- TrackPad副点击(右下角/左下角点击或双指点击)
- 鼠标左键点击
- 鼠标右键点击
我们实现了SecondaryActionInteraction类(代码如下),并在Info.plist中添加了UIApplicationSupportsIndirectInputEvents = YES配置,将该交互绑定到视图上。
class SecondaryActionInteraction: NSObject, UIInteraction { weak var target: AnyObject? var action: Selector private(set) weak var view: UIView? init(target: AnyObject, action: Selector) { self.target = target self.action = action } private lazy var oneTapGestureRecognizer = UITapGestureRecognizer( target: self, action: #selector(handlePrimaryClick) ) private var gestureRecognizersList: [UIGestureRecognizer] { var recognizers: [UIGestureRecognizer] = [oneTapGestureRecognizer] if #available(iOS 13.4, *) { let twoTapGestureRecognizer: UITapGestureRecognizer = { let recognizer = UITapGestureRecognizer( target: self, action: #selector(handleSecondaryClick) ) recognizer.allowedTouchTypes_ = [.indirectPointer] recognizer.buttonMaskRequired = .secondary return recognizer }() recognizers.append(twoTapGestureRecognizer) } return recognizers } func willMove(to newView: UIView?) { guard let oldView = self.view else { return; } for recognizer in gestureRecognizersList { oldView.removeGestureRecognizer(recognizer) } } func didMove(to newView: UIView?) { self.view = newView guard let newView = newView else { return } for recognizer in gestureRecognizersList { newView.addGestureRecognizer(recognizer) } } @objc private func handlePrimaryClick() { sendActions() } @objc private func handleSecondaryClick() { sendActions() } private func sendActions() { UIApplication.shared.sendAction(action, to: target, from: self, for: nil) } } extension UIGestureRecognizer { var allowedTouchTypes_: [UITouch.TouchType] { get { allowedTouchTypes.map { nsNumber -> UITouch.TouchType in UITouch.TouchType(rawValue: nsNumber.intValue)! } } set { allowedTouchTypes = newValue.map { type -> NSNumber in NSNumber(value: type.rawValue) } } } }
绑定代码:
let tapActionInteraction = SecondaryActionInteraction(target: self, action: #selector(onTapAction)) view.addInteraction(tapActionInteraction)
实际效果:
- iPad端连接鼠标或TrackPad时,所有点击操作均正常触发菜单
- 适配iPad的M1 Mac端仅TrackPad主点击、鼠标左键有效,TrackPad副点击、鼠标右键无响应;仅按住Ctrl+鼠标左键可触发
twoTapGestureRecognizer,不符合预期。
请帮忙排查问题原因。
内容的提问来源于stack exchange,提问作者Pavel Zorin
相关产品推荐
相关产品推荐

