2015-03-24 1 views
4

Я внедрил пользовательский NSView, который содержит много NSTextField и других NSView. Затем я ввел это пользовательское представление в виде прокрутки, используя «Редактор»> «Вставить в»> «Просмотр прокрутки». Это создает соответствующую иерархию как видимую в контуре, но мне нужно было затем добавить ограничения автоматического макета, чтобы указать, где это представление прокрутки должно быть помещено в представление (сверху, снизу, впереди, завершение). Кроме того, мне пришлось добавить ограничения для пользовательского представления, настроенного против представления клипа, чтобы выложить элементы в нужном месте. Это хорошо работает, когда я запускаю приложение, все элементы отображаются соответствующим образом, а представление выполняет прокрутку. Тем не менее, когда я уменьшаю высоту основного вида, чтобы на экране не отображались не все элементы, появляются предупреждения автоматического макета, и когда я обновляю фреймы, он снова увеличивает высоту представления. Чтобы исправить это, мне пришлось удалить нижнее ограничение вида прокрутки к основному виду. Теперь, когда я запускаю приложение, окно устанавливается в нужный размер, но я не могу прокручивать пользовательский вид, чтобы добраться до нижней части содержимого - он ограничен, поэтому он не будет прокручиваться вообще, кроме эффекта упругого отскока, re на границе. Поэтому мой вопрос: что мне делать, чтобы разрешить прокрутку этого прокрутки, когда я выкладываю все элементы в XIB и используя автоматический макет?Включение NSScrollView для прокрутки его содержимого с помощью автоматической компоновки в построителе интерфейса

ответ

9

Вот общий подход:

  • сделать вид документа, по крайней мере, как высокий, как вид клипа. Или, что то же самое, сделать просмотр клипа не выше, чем просмотр документа.
  • Разрешить просмотр документа для роста в высоту, но не уступать его требованиям.
  • Предотвращение двусмысленности в представлении документа с помощью ограничения с низким приоритетом, чтобы сделать его как можно меньшим, учитывая другие ограничения.

Так, к примеру, должно быть ограничение между дном зрения зажима и нижним видом документа, но оно должно быть неравенством: Superview.Bottom < = Документ View.Bottom. (Или, что то же самое, Document View.Bottom> = Superview.Bottom.)

Внутри документа вид у вас, вероятно, есть текстовое поле или что-то внизу, а также ограничение между ним и снизу документа. Сделайте это ограничение неравенством: Superview.Bottom> = Текстовое поле.Bottom + стандартный интервал.

Это вызовет двусмысленность относительно высоты документа. Это может быть любой размер, достаточно высокий, чтобы соответствовать всем его подзонам. Добавьте ограничение высоты. Задайте приоритет 51 и его константу равным 0. То есть, она хочет, чтобы представление имело 0 высоты, но с очень низким приоритетом, так что почти все остальное заменит его. Но это устраняет двусмысленность.

Если вы хотите разрешить горизонтальную прокрутку, вам необходимо сделать одну и ту же общую вещь в горизонтальной ориентации.


Update:

Там другой подход. Настройте ограничения в представлении документа, чтобы придать ему строгий размер (без неравенства). Обычно это цепочка ограничений от вершины к верхнему подвью, от нижней части подвид до верхней части другого поднабора и т. Д., И от нижней части нижней части к нижней части документа. То же самое для ведения трейдинга.

Тогда единственными необходимыми ограничениями между представлением клипа и видом документа являются верхние и ведущие ограничения.

Если вы проверите в этой конфигурации, вы сможете изменить размер и прокрутить прокрутку. Итак, это хорошо. Однако, когда область содержимого прокрутки выше, чем вид документа, представление документа будет закреплено в нижней части области содержимого. Обычно вы хотите, чтобы это было приковано к вершине в этой ситуации.

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

Итак, последний фрагмент должен создать подкласс NSClipView, который отменяет -isFlipped для возврата YES. Затем установите класс представления клипа в NIB в ваш подкласс. После этого он будет работать так, как вы хотите.

+0

Спасибо! Я следил за вашими предложениями, но IB бросает ошибку для Clip View.Bottom <= Document View.Bottom constraint - неопределенность ограничения ограничений. Я не уверен, как это решить. Если я запустил приложение в этот момент, он будет вести себя так же, как и раньше, - правильный размер, но не может прокручиваться. – Joey

+0

В зависимости от порядка, в котором вы делали что-то, это может произойти, но должно быть только временным, пока вы не установите другие ограничения. У вас есть ограничения, фиксирующие размер самого представления прокрутки, правильно? И у вас есть ограничения, которые эффективно определяют размер для представления документа (он, по крайней мере, достаточно велик, чтобы содержать его подпункты плюс ограничение с низким приоритетом, чтобы сохранить его как можно меньше в противном случае)? Существуют ли ограничения сверху, ведущего и трейлинг между ним и представлением клипа в дополнение к неравенству Bottom? –

+0

Спасибо, я не добавил обратно нижнее ограничение на представление прокрутки. После того, как я добавил, что он работал красиво. Очень признателен! – Joey

Смежные вопросы