You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:32:58