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

SwiftUI自定义macOS 14.6光标修饰器无法稳定工作的问题

自定义NSCursor修饰器兼容macOS 14.6的问题

由于.pointerStyle(.link)修饰器仅支持macOS 15及以上版本,为兼容macOS 14.6,我自定义了一个修饰器模拟该行为,但遇到以下三个问题:

  • 鼠标悬停视图时,光标需点击后才更新(已通过print语句确认修饰器代码已执行);
  • 点击视图会导致光标重置(因失去悬停状态),但并非首次点击就出现该情况;
  • 修饰器内的onTapGesture(perform:)会阻塞外部设置的onTapGestures(perform:),使用simultaneousGesture(_:)可解决此问题,但需将pointer(_:)修饰器放在外部onTapGesture(perform:)之后。

自定义PointerModifier代码如下:

import SwiftUI

struct PointerModifier: ViewModifier {
    var pointer: NSCursor

    func body(content: Content) -> some View {
        content
            .onTapGesture {
                DispatchQueue.main.async {
                    let _ = print("TapGesture: Pushing new mouse cursor")
                    pointer.push()
                }
            }
            // Or
//            .simultaneousGesture(TapGesture().onEnded({
//                DispatchQueue.main.async {
//                    let _ = print("TapGesture: Pushing new mouse cursor")
//                    pointer.push()
//                }
//            }))
            .onHover { hover in
                DispatchQueue.main.async {
                    if hover {
                        let _ = print("Hover: Pushing new mouse cursor")
                        pointer.push()
                    } else {
                        let _ = print("Hover: Popping mouse cursor")
                        NSCursor.pop()
                    }
                }
            }
    }
}

extension View {
    func pointer(_ pointer: NSCursor) -> some View {
        modifier(PointerModifier(pointer: pointer))
    }
}

内容的提问来源于stack exchange,提问作者dohpaz42

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 07:52:32