如何在不改变位置的情况下修改窗口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




