Ограничить окно в определенных пропорциях - PullRequest
0 голосов
/ 24 марта 2011

У меня есть опыт разработки под 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 ]

4 голосов
/ 17 сентября 2012

Самый простой способ ограничить окно заданным соотношением - это использовать -[NSWindow setAspectRatio:] или -[NSWindow setContentAspectRatio:].

3 голосов
/ 04 мая 2012

Я наткнулся на этот вопрос, и это были именно мои потребности. Однако, ответ не был достаточно ясен для реализации за 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 голосов
/ 24 марта 2011

Назначьте делегат вашему окну, если вы еще этого не сделали, и реализуйте метод -windowWillResize: toSize: делегат.Запрошенный размер передается как второй аргумент;Вы можете изменить это и вернуть другой размер, который соответствует желаемому соотношению.

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSWindowDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/NSWindowDelegate/windowWillResize:toSize:

1 голос
/ 11 марта 2012

Вот решение для окна, которое всегда на 100 пикселей шире, чем оно высокое.Вы можете легко заменить логику так, чтобы вместо этого она сохраняла постоянное соотношение.

Ключевым моментом в этой реализации является то, что он замечает, какой край изменяет размеры окна, для систем, подобных 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;
}
...