У меня проблема с изменением размера вертикального окна, работающим с прокруткой в режиме автоматического макета.Как изменить размер NSWindow прямо в мире автомакетов
Что я Хочу
Я хотел бы повторить, насколько это возможно, текущее окно моего приложения в изменении размеров поведения. Ширина окна является гибкой, но высота окна обычно должна отслеживать высоту содержимого. В частности:
- Обычно, окно автоматически изменяет свою высоту, чтобы точно соответствовать
его содержимое (за исключением # 2). - Пользователь может вручную изменить размер окна таким образом, чтобы он был меньше его содержимого , и в этом случае вложенное представление прокрутки будет прокручивать содержимое . После того, как оно сделано короче, окно остается такой, пока вручную не изменится размер , или содержимое снова станет равным или меньше, чем окно.
- Если содержимое растет до такой степени, что нижняя часть окна сталкивается с границами док-станции или экрана, высота окна привязана к этой высоте так же, как если бы пользователь изменил ее размер.
Что у меня есть
Я создал окно с набором представительных подвидов, которые имитируют основные потребности моего приложения. иерархия окна проста:
Window
NSView (contentView)
NSScrollView
NSClipView (NSScrollView.contentView)
NSView (NSScrollView.documentView)
A bunch of standard and custom subviews with constraints
Вы можете загрузить тестовый проект здесь (MacOS 10,12/Xcode 8): http://mbx.cm/t/4FUGY
Я организовал различные подвидов, так что они имеют гибкую ширину, но ограничения определите ровно одну возможную высоту. Родительский вид прокрутки заполняет представление содержимого окна.
Автомашина отлично работает. Окно автоматически изменяется в соответствии с размером содержимого. Если высота содержимого изменяется, высота окна меняется на совпадение. Потрясающие.
Что я не могу получить, чтобы работать
у меня не было никакой удачи получать NSWindow позволить мне вручную изменить его высоту. Индикатор изменения размера (при наведении курсора по краю) показывает, что я могу изменить ширину окна, но не его высоту.
Первоначально я думал: «О, это должно быть приоритетом сопротивления сжатию в одном из видов прокрутки». Но я не могу найти сочетание сопротивления сжатию или обнимать приоритеты, которые изменят это поведение. Я попытался установить приоритеты самого представления прокрутки и документа documentView (что не имеет для меня никакого смысла, но я все равно пытался). Я пробовал значения 749, 499, 49 и 1 в каждой комбинации, о которой я мог думать.
Я искал каждую проблему, которая, казалось, была выпущена для этого, но большинство размещенных вопросов, казалось, решали различные проблемы.
Я добавил кнопку «Дамп» для регистрации вертикальных ограничений. Все перечисленное выглядит как ожидалось, за исключением нескольких объектов NSAutoresizingMaskLayoutConstraint, которые я не понимаю.Однако они представляют собой ограничения между представлением документа и представлением клипа, поэтому я предполагаю, что они автоматически создаются и не являются частью проблемы.
<NSLayoutConstraint:0x608000082580 PartBoxView:0x608000140840'Part B'.height == 96 (active)>
<NSLayoutConstraint:0x608000083de0 V:[PartBoxView:0x608000140840'Part B']-(0)-| (active, names: '|':NSView:0x6080001212c0)>
<NSLayoutConstraint:0x608000083e80 V:[PartBoxView:0x608000140370'Part A']-(NSSpace(8))-[PartBoxView:0x608000140840'Part B'] (active)>
<NSLayoutConstraint:0x608000082da0 V:|-(0)-[NSScrollView:0x6080001c10e0] (active, names: '|':NSView:0x608000121400)>
<NSLayoutConstraint:0x608000083430 V:|-(0)-[NSView:0x6080001212c0] (active, names: '|':NSClipView:0x10040e2a0)>
<NSLayoutConstraint:0x608000081e00 V:[NSScrollView:0x6080001c10e0]-(0)-| (active, names: '|':NSView:0x608000121400)>
<NSAutoresizingMaskLayoutConstraint:0x650000082b20 h=-&- v=-&- NSView:0x608000121400.minY == 0 (active, names: '|':NSThemeFrame:0x102504ea0'Window')>
<NSAutoresizingMaskLayoutConstraint:0x6500000823f0 h=-&- v=-&- NSClipView:0x10040e2a0.minY == 1 (active, names: '|':NSScrollView:0x6080001c10e0)>
<NSLayoutConstraint:0x608000083480 V:[NSView:0x6080001212c0]-(0)-| (active, names: '|':NSClipView:0x10040e2a0)>
<NSAutoresizingMaskLayoutConstraint:0x650000082440 h=-&- v=-&- V:[NSClipView:0x10040e2a0]-(1)-| (active, names: '|':NSScrollView:0x6080001c10e0)>
<NSLayoutConstraint:0x608000083d40 V:|-(0)-[PartBoxView:0x608000140370'Part A'] (active, names: '|':NSView:0x6080001212c0)>
<NSLayoutConstraint:0x608000083c50 V:[NSImageView:0x608000161bc0]-(20)-| (active, names: '|':PartBoxView:0x608000140370'Part A')>
<NSLayoutConstraint:0x608000083bb0 V:|-(20)-[NSImageView:0x608000161bc0] (active, names: '|':PartBoxView:0x608000140370'Part A')>
<NSLayoutConstraint:0x608000083660 NSImageView:0x608000161bc0.height == 64 (active)>
Я надеюсь, что кто-то с автомастером может рассказать мне, как получить № 2. Я почти уверен, что # 3 потребует какой-то пользовательский код, но №2 - это большой барьер.
Фоновой
Я нахожусь в процессе подачи моего приложения крупной подтяжки лица. Это довольно большое приложение, поэтому я начал с создания набора тестовых проектов для тестирования некоторых новых пользовательских интерфейсов и методов.
Первое крупное предприятие превращает все в автомат. Большинство из них похоже, что это будет довольно гладко, и я с нетерпением жду некоторых из многих преимуществ автоматической компоновки.
Кен, Спасибо за обстоятельный и вдумчивый ответ. –