NSStackView показывает только новейший пользовательский вид

У меня есть пользовательский класс контроллера представления. Я хочу создать несколько пользовательских контроллеров представления и добавить их представления в мой NSStackView. Я добавляю новый вид в вид стека, нажимая кнопку. Кнопка вызывает этот метод:

[stackView insertView:myCustomViewController.view atIndex:0 inGravity:NSStackViewGravityBottom];

Однако, когда добавляется новый вид, он добавляется stackView.spacing ниже того места, где был предыдущий вид, но этот предыдущий вид больше не виден, однако он по-прежнему отображается как вид в моей нижней гравитации, что подтверждается при вызове

NSLog(@"%lu",(unsigned long)[stackView viewsInGravity:NSStackViewGravityBottom].count);

У меня нет этой проблемы, если я пытаюсь добавить NSButtons, так что это как-то связано с моим пользовательским видом, но я не могу понять, что.

Пожалуйста помоги. Спасибо!

1 ответ

Решение

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

Вы можете проверить, происходит ли это:

[stackView insertView:myCustomViewController.view atIndex:0 inGravity:NSStackViewGravityBottom];
[stackView layoutSubtreeIfNeeded];
NSLog(@"%f - %d", NSHeight(myCustomViewController.view.frame), [myCustomViewController.view hasAmbiguousLayout]);


С StackView вы увидите, что последующие выдают "0 - 1". Высоты 0, и они неоднозначны.

Вертикальный NSStackView будет только позиционировать виды по вертикали, но не даст определенной высоты. (То же самое для горизонтальных стеков и ширины).

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