如何将基于CALayer的视图正确缩放至全屏?
macOS全屏切换时CALayer缩放异常问题
我之前一直使用:
override func draw(_ dirtyRect: NSRect)
来绘制NSView。根据Xcode提示,设置wantsLayer = true基于图层绘制更简便且省电,于是我将大型应用改造为用图层替代直接视图绘制。但切换全屏时出现问题:缩放后文本过小,返回普通模式时文本先过大,而实时调整窗口大小却完全正常。
似乎图层在新边界设置前就已更新,且layer?.frame表现异常。我制作了示例应用,用黄色背景的NSTextField标签和带绿色背景、包含CATextLayer的自定义视图演示该问题。
我尝试过多种调整后刷新视图的方案,结果一致。目前通过NSWindowDelegate方法修正尺寸:
func windowDidEnterFullScreen(_ notification: Notification) { resizingLayerView.willResize(suppressImplicitAnimation: false) }
其中ResizingLayerView类的方法如下:
func willResize(suppressImplicitAnimation: Bool = true) { if suppressImplicitAnimation { CATransaction.begin() CATransaction.setDisableActions(true) } if let frame = layer?.frame { text.fontSize = frame.height * 200/360 text.frame = frame } if suppressImplicitAnimation { CATransaction.commit() } }
注:200为初始字体大小,360为初始bounds.height
处理后文本尺寸正常,但动画效果很差!
请问如何正确将CALayer缩放至全屏?
内容的提问来源于stack exchange,提问作者Lego Esprit
相关产品推荐
相关产品推荐

