You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在不改变位置的情况下修改窗口Frame尺寸?

解决macOS窗口修改尺寸不改变位置的问题

嘿,这个场景我太熟悉了!你之前用setFrame时直接传了固定的(0,0)坐标,所以窗口才会跑到左上角。其实只要复用窗口当前的位置坐标,只修改尺寸部分,就能完美实现只调大小不挪位置的需求。

两种简单的实现方式:

方式一:直接修改frame的size属性

这种写法最直观,先拿到当前窗口的frame,修改它的size后再重新设置回去:

// 安全地获取当前窗口的frame
if var currentFrame = self.view.window?.frame {
    // 设置你想要的新尺寸
    currentFrame.size = CGSize(width: 430, height: 310)
    // 应用新的frame,保持位置不变
    self.view.window?.setFrame(currentFrame, display: true, animate: true)
}

方式二:基于当前origin构建新Frame

如果你更倾向于显式构建新的NSRect,可以保留当前窗口的x、y坐标,只替换宽高:

guard let window = self.view.window, let currentFrame = self.view.window?.frame else { return }

let newSize = CGSize(width: 430, height: 310)
// 保留原位置,使用新尺寸
let newFrame = NSRect(origin: currentFrame.origin, size: newSize)

window.setFrame(newFrame, display: true, animate: true)

为什么这个方法有效?

窗口的frame是一个包含位置(origin)和尺寸(size)的NSRect,你之前的写法直接把origin设成了(0,0),所以窗口位置才会改变。上面两种方法都是完全保留了原来的origin坐标,只更新size部分,自然就不会移动窗口位置啦。

如果后续需要让窗口调整尺寸时保持居中(比如从中心向外扩展/收缩),可以结合setFrameOrigin做坐标计算,但针对你当前的需求,上面的方法就完全够用了。

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

火山引擎 最新活动