将窗口限制为特定比例

时间:2011-03-24 03:01:08

标签: macos resize nswindow

我在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;
}

4 个答案:

答案 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:委托方法。请求的大小作为第二个参数传递;您可以修改它并返回与您想要的比例匹配的不同大小。

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSWindowDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/NSWindowDelegate/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;
}