Переместите NSBox на верхнюю панель горизонтального NSSplitView.

У меня проблема, связанная с системой координат в Какао, но я действительно не знаю. Все это происходит в верхней панели горизонтальной NSSplitView,

Очень просто, я пытаюсь позиционировать один NSBox прямо под вторым (я загружаю пользовательские представления в коробки - все работает нормально). Верхний левый угол верхнего поля находится в верхнем левом углу панели и никогда не изменяется. Если высота верха NSBox сжимается я хочу верх второго NSBox скользить прямо под ним. И наоборот, если верх NSBox's Высота увеличивается, я хочу дно NSBox скользить вниз.

Этот код вызывается дважды. Ящик правильный (первый верхний ящик, второй нижний ящик) и v правильный (это представление, которое я загружаю в ящик - это работает нормально, и это то, что вызывает изменение высоты в верхнем окне).

 NSSize destBoxSize = [[box contentView] frame].size;  //the size of the box in the view to load the view into
 NSSize newViewSize = [v frame].size;  // the size of the view to be loaded 

 float deltaWidth = [horizSplitView frame].size.width - destBoxSize.width;
 float deltaHeight = newViewSize.height - destBoxSize.height;
 NSRect boxFrame = [box frame];
 boxFrame.size.height += deltaHeight;
 boxFrame.size.width += deltaWidth; 
 boxFrame.origin.y -= deltaHeight;

 NSLog(@"vc=%@ boxFrame x%f y%f h%f w%f", nibName, boxFrame.origin.x, boxFrame.origin.y, boxFrame.size.height, boxFrame.size.width);

 // Clear the box for resizing
 [box setContentView:nil]; 
 [box setContentView:v];
 [box setFrame:boxFrame];

1 ответ

То, что вы хотите сделать, не так сложно, но это потребует некоторого подкласса. Прежде всего, вам нужно создать подкласс NSSplitView и либо переопределить либо -(void)init, либо -(void)awakeFromNib, чтобы добавить эту строку:

[self setAutoresizesSubviews:YES];  //

Затем вам нужно создать подклассы для двух блоков и установить их маски автоматического изменения размера, либо в -(void)init, либо в - (void)viewWillMoveToSuperview:(NSView *)newSuperView. Для первой коробки вы, вероятно, захотите:

[newInstance setAutoresizingMask:NSViewNotSizable];

Для второго bbox вы, вероятно, захотите:

[newInstance setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin];

Смотрите также NSView. Нужно немного поэкспериментировать, чтобы получить правильную комбинацию, но потом она работает довольно хорошо.

Другие вопросы по тегам