Переместите NSBox на верхнюю панель горизонтального NSSplitView. - PullRequest
0 голосов
/ 22 декабря 2009

У меня проблема, связанная с системой координат в Какао, но я действительно не знаю. Все это происходит на верхней панели горизонтальной 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 Ответ

0 голосов
/ 22 декабря 2009

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

[self setAutoresizesSubviews:YES];  //

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

[newInstance setAutoresizingMask:NSViewNotSizable];

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

[newInstance setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin];

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

...