我在iOS开发方面经验丰富,但今晚我正在尝试MacOS开发。
有没有办法将窗户限制在一定比例?我不介意如果用户想要使窗口变大或变小,我只是想确保它总是具有相同的高/宽比。
编辑:
- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize {
float ratio = self.window.frame.size.height / self.window.frame.size.width;
NSSize newSize = NSMakeSize(frameSize.width, frameSize.height / ratio);
return newSize;
}
答案 0 :(得分:4)
将窗口限制为给定比率的最简单方法是使用-[NSWindow setAspectRatio:]
或-[NSWindow setContentAspectRatio:]
。
答案 1 :(得分:3)
我偶然发现了这个问题,这正是我的需要..然而,答案还不够明确,1秒钟实现^^;
以下是您想要的代码:
如果你有整个窗口的比例(包括标题栏)
- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize {
frameSize.width = frameSize.height * 1.333;
return frameSize;
}
如果您(像我一样)想要在不考虑标题栏的情况下约束窗口大小。
- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize {
NSSize contentSize = [sender contentRectForFrameRect:NSMakeRect(0, 0, frameSize.width, frameSize.height)].size;
contentSize.height = contentSize.width * 0.75;
return [sender frameRectForContentRect:NSMakeRect(0, 0, contentSize.width, contentSize.height)].size;
}
替换所需的宽高比,而不是1.333,高度/宽度比率代替0.75
我的案例:
我需要iPad比率1024/768 = 1.333 ......
答案 2 :(得分:2)
如果您还没有委托给窗口,请执行-windowWillResize:toSize:委托方法。请求的大小作为第二个参数传递;您可以修改它并返回与您想要的比例匹配的不同大小。
答案 3 :(得分:1)
这是一个窗口的解决方案,它总是比它高100px宽。您可以想象轻松替换逻辑,以便它保持恒定的比率。
这个实现中的关键是它注意到哪个边缘正在调整窗口大小,对于像Lion这样允许从任何窗口边缘调整大小的系统。在此示例中,调整大小边缘保持钳制为主值。
我不知道是否有一种标准方法来确定哪个边缘正在调整窗口大小。但是可以使用此处演示的逻辑轻松检测到它。
// Track resizing based on how it starts
typedef enum MyResizeType {
resizeNone,
resizeWidth,
resizeHeight,
resizeBoth
} MyResizeType;
static MyResizeType resizeType = resizeNone;
- (void)windowDidEndLiveResize:(NSNotification *)notification {
resizeType = resizeNone;
}
- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize {
// Width should always be 100 bigger than the Height...
CGSize currSize = sender.frame.size;
BOOL wdiff = currSize.width != frameSize.width,
hdiff = currSize.height != frameSize.height;
if (resizeType == resizeNone) {
if (wdiff || hdiff) {
if (wdiff && hdiff) {
resizeType = resizeBoth;
}
else if (hdiff) {
resizeType = resizeHeight;
}
else {
resizeType = resizeWidth;
}
}
}
CGFloat newHeight;
switch (resizeType) {
case resizeWidth:
newHeight = frameSize.width - 100.0;
if (hdiff) resizeType = resizeBoth;
break;
case resizeHeight:
newHeight = frameSize.height;
if (wdiff) resizeType = resizeBoth;
break;
case resizeBoth:
newHeight = MAX(frameSize.height, frameSize.width - 100.0);
break;
default:
newHeight = frameSize.height; // this will never happen, but best to set it
break;
}
NSSize newSize = { newHeight + 100.0, newHeight };
return newSize;
}