Cocoa macOS应用可否默认实现按住Option键的NSWindow缩放效果?
macOS Cocoa NSWindow默认中心锚点缩放实现方案
可以实现,最通用的方案是子类化NSWindow,重写尺寸设置逻辑,不需要依赖Option修饰键即可默认实现按住Option缩放的中心锚点效果。
实现思路
窗口缩放时系统会调用setFrame:display:方法传入计算好的新frame,我们只需要提前记录缩放前的窗口中心点,再根据新尺寸调整frame的origin,强制保持中心点不变即可。
代码示例
Objective-C 版本
// CenteredResizeWindow.h #import <Cocoa/Cocoa.h> @interface CenteredResizeWindow : NSWindow @end
// CenteredResizeWindow.m #import "CenteredResizeWindow.h" @implementation CenteredResizeWindow - (void)setFrame:(NSRect)frameRect display:(BOOL)displayFlag { // 记录缩放前的窗口中心点 NSPoint originalCenter = NSMakePoint( NSMidX(self.frame), NSMidY(self.frame) ); // 调整新frame的原点,保持中心点不变 NSRect adjustedFrame = frameRect; adjustedFrame.origin.x = originalCenter.x - adjustedFrame.size.width / 2; adjustedFrame.origin.y = originalCenter.y - adjustedFrame.size.height / 2; [super setFrame:adjustedFrame display:displayFlag]; } @end
Swift 版本
import Cocoa class CenteredResizeWindow: NSWindow { override func setFrame(_ frameRect: NSRect, display displayFlag: Bool) { // 记录缩放前的窗口中心点 let originalCenter = NSPoint(x: self.frame.midX, y: self.frame.midY) var adjustedFrame = frameRect adjustedFrame.origin.x = originalCenter.x - adjustedFrame.width / 2 adjustedFrame.origin.y = originalCenter.y - adjustedFrame.height / 2 super.setFrame(adjustedFrame, display: displayFlag) } }
注意事项
- 该实现覆盖所有缩放场景:拖拽任意边缘、任意角落缩放,都会保持中心锚点,和系统按住Option键的缩放效果完全一致。
- 可以在子类中新增自定义开关属性,按需切换中心锚点/默认左上角锚点模式。
- 实现完全使用公开API,符合App Store审核规则。
- 和系统自带的最小/最大尺寸限制逻辑无冲突,可正常搭配使用。
内容的提问来源于stack exchange,提问作者Alfonso Tesauro
相关产品推荐
相关产品推荐

