如何在Mac Catalyst应用中抑制光标样式变化?
Mac Catalyst模态视图控制器光标异常问题
问题描述
- 原iPad适配应用新增Mac Catalyst支持,模态视图控制器在Catalyst环境下无法通过点击外部关闭,已通过悬浮手势识别器添加红点关闭按钮(模仿Mac应用交互逻辑)
- 视图边缘光标会变为双箭头,但该视图不可调整大小,此光标变化无意义,希望保持默认箭头样式;尝试给视图控制器的view及其window添加悬浮手势识别器覆盖该行为,无效
- 当光标为双箭头时点击拖动,可拖动某个过渡视图仅1个点距离,之后光标变为向下箭头,视图内部出现异常变化
效果演示


视图层级结构

解决方案
1. 定位并禁用系统调整容器视图的光标行为
Mac Catalyst会给模态视图的底层系统容器添加调整大小的光标逻辑,遍历视图层级找到该容器并修改:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) func findResizeContainer(in view: UIView) -> UIView? { if NSStringFromClass(type(of: view)).contains("UICatalystWindowResizeContainerView") { return view } for subview in view.subviews { if let container = findResizeContainer(in: subview) { return container } } return nil } guard let window = view.window, let resizeContainer = findResizeContainer(in: window) else { return } // 添加空手势覆盖系统调整手势 resizeContainer.addGestureRecognizer(UIPanGestureRecognizer()) // 强制设置默认箭头光标 resizeContainer.catalystCursor = .arrow }
2. 修改模态呈现样式
更换模态视图控制器的呈现样式,避免系统自动添加调整大小逻辑:
let modalVC = YourModalViewController() // 使用overFullScreen避免系统生成可调整容器 modalVC.modalPresentationStyle = .overFullScreen modalVC.modalTransitionStyle = .crossDissolve present(modalVC, animated: true)
3. 全局锁定默认光标(兜底方案)
在应用启动时全局设置默认光标为箭头:
// AppDelegate或SceneDelegate中 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { NSCursor.arrow.set() return true }
4. 固定模态视图尺寸
设置固定的preferredContentSize,避免拖动导致的视图尺寸异常:
override func viewDidLoad() { super.viewDidLoad() preferredContentSize = CGSize(width: 600, height: 400) // 根据需求设置固定尺寸 }
内容的提问来源于stack exchange,提问作者Victor Engel
相关产品推荐
相关产品推荐

