macOS Swift如何基于已旋转CALayer的角度和边界同步旋转上层NSView
问题核心原因
- 图层应用
CGAffineTransform后,frame属性代表的是变换后的外包围盒坐标,直接通过frame设置位置/尺寸会出现偏差 - 先设置
frame再应用变换的顺序错误,会导致坐标计算异常
修正后实现代码
let view = NSView() view.wantsLayer = true // 先设置视图自身尺寸,使用bounds不受变换影响 view.bounds = caLayer.bounds // 直接对齐图层位置,使用position而非frame.center view.layer?.position = caLayer.position // 应用和目标CALayer完全一致的仿射变换 view.layer?.setAffineTransform(caLayer.affineTransform()) view.layer?.borderColor = NSColor.red.cgColor view.layer?.borderWidth = 1.0 view.layer?.zPosition = caLayer.zPosition + 1 containerView.addSubview(view)
额外注意事项
- 若后续
caLayer的旋转角度/位置会动态更新,需要同步将caLayer的affineTransform、position属性到新增NSView的对应属性,保证两者状态完全同步 - 视图应用变换后不要直接修改
frame属性,否则会触发意外的坐标偏移
内容的提问来源于stack exchange,提问作者M Afham
相关产品推荐
相关产品推荐

