Изменить размер окна при добавлении / замене внутреннего вида (OSX, какао)?

У меня есть окно, которое является заполнителем для двух разных (по размеру) представлений (переключение между ними).

Я хотел бы изменять размер окна при переключении вида.

Вот что я придумал (это называется сразу после replaceSubview или addSubview):

- (void) resizeViews: (NSView*) customView{
  NSView* contentView = self.window.contentView;
  [customView setTranslatesAutoresizingMaskIntoConstraints:YES];

  NSDictionary *views = NSDictionaryOfVariableBindings(customView);

  [contentView addConstraints:
    [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[customView]|"
        options:0
        metrics:nil
        views:views]];

  [contentView addConstraints:
    [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[customView]|"
    options:0
    metrics:nil
}

Это работает только для изменения размера по горизонтали, по вертикали окно остается в своем исходном размере (как установлено в IB).

Я удалил все ограничения из окна, безуспешно.

Извините, если это что-то очевидное - я новичок в Какао.


person Nikolay Tsenkov    schedule 25.04.2014    source источник


Ответы (1)


Я придумал что-то взломанное, пока это нормально.

Если кто-то может предложить лучшее решение, сделайте это (я не собираюсь отмечать это как ответ в течение некоторого времени):

- (void) onAddedView: (NSView*) newView{
  NSView* parentView = self.window.contentView;
  NSRect parentFrame = [self.window frame];
  CGSize newSize = [newView frame].size;
  int titlebarHeight = 22; // TODO: how to get this automatically?

  // resize the window (and reposition it) to fit the added view
  newSize.height += titlebarHeight;
  parentFrame.origin.y += parentFrame.size.height; // remove the old height
  parentFrame.origin.y -= newSize.height; // add the new height
  parentFrame.size = newSize;

  // center the added view
  [newView setFrameOrigin:NSMakePoint(
    (NSWidth([parentView bounds]) - NSWidth([newView frame])) / 2,
    (NSHeight([parentView bounds]) - NSHeight([newView frame])) / 2
  )];
  [newView setAutoresizingMask:NSViewMinXMargin | NSViewMaxXMargin | NSViewMinYMargin | NSViewMaxYMargin];

  // render changed view
  [self.window setFrame: parentFrame display: YES animate: NO];
}
person Nikolay Tsenkov    schedule 25.04.2014