Переместите 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. Нужно немного поэкспериментировать, чтобы получить правильную комбинацию, но потом она работает довольно хорошо.