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

如何将基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:22:09