ОК, давайте представим себе следующую иерархию зрения (обратите внимание, глядя на ограничения в Interface Builder легче, если вы даете эти взгляды уникальные имена в разделе «Документ» из «Идентичность инспектор "):
чтобы установить, что вы хотите добавить следующие ограничения в IB (я justing буду писать его в VFL, потому что это очень лаконичный способ показать ограничения) :
Очевидно, что определение прокрутки вида по отношению к его надтаблицы (главный вид, в этом примере):
H:|[scrollView]|
V:|[scrollView]|
Определить, contentView
такое, что
Это ширина такая же, в качестве основного вида (==view
) и
Проспект прокрутки contentSize
изменится в соответствии с размером contentView
. В отношении TN2154 ограничения между scrollview и его подзонами определяют вид прокрутки contentSize
, а не относительный размер подзонов.
Таким образом:
H:|[contentView(==view)]|
V:|[contentView]|
Определить макет для трех меток таким образом, чтобы они смещенные в contentView
:
H:|-[label1]-|
H:|-[label2]-|
H:|-[label3]-|
Вместо жесткого кодирования высоты contentView
(и, следовательно, contentSize
прокрутки, вместо этого просто определите отношение метки к вертикальной высоте contentView
, который (из шага 2, выше), регулирует вертикальную высоту contentSize
в представлении прокрутки:
V:|-[label1]-[label2]-[label3]-|
Это все, что вам нужно сделать. Я не кодировал какую-либо ширину (основной вид имеет ширину автоматически, и как вид прокрутки, так и, что более важно, contentView
определяют их ширину, связанную с этим. Но ширина меток является вставкой из contentView
и высотой contentView
(и, таким образом, вид свитка contentSize
) выводится из внутренней высоты трех меток
Конечным результатом является то ограничения в ИБ, которые выглядят как:.
FYI, если вы хотите для диагностики, вы можете нажмите на кнопку отладки в то время как приложение работает на тренажере:
Вы можете увидеть вид (и, при необходимости ограничения) и убедитесь, что все выглядит нормально:
Вы также можете посмотреть на _autolayoutTrace
через (lldb)
строки:
(lldb) po [[UIWindow keyWindow] _autolayoutTrace]
UIWindow:0x7fbbb3617910
| •UIView:0x7fbbb349a840
| | *UIScrollView:0x7fbbb3491c80
| | | *UIView:0x7fbbb348e180
| | | | *UILabel:0x7fbbb348e450'Label'
| | | | *UILabel:0x7fbbb3490670'Label'
| | | | *UILabel:0x7fbbb3490a70'Label'
| | | UIImageView:0x7fbbb34a3eb0
| | | UIImageView:0x7fbbb34a3800
| | *_UILayoutGuide:0x7fbbb349a970
| | *_UILayoutGuide:0x7fbbb349b460
Это подтверждает, что нет противоречивых макетов и нет двусмысленных макетов.
Предполагаете, что вы хотите, чтобы 'contentView' был такой же ширины основного вида? И я предполагаю, что вы добавили ведущие/трейлинг-ограничения для 'contentView' в' UIScrollView'. Проблема в том, что эти ограничения просто корректируют 'contentSize' прокрутки, а не размер' contentView'. В нижней строке вы должны добавить ограничение между этим 'contentView' и' superview' 'UIScrollView'. См. Http://stackoverflow.com/a/22772106/1271826. – Rob
Я отредактировал мой вопрос. Я попробовал это с ограничениями между contentview и mainview, но все равно никакого результата. – Kingalione
Да, contentView должен быть таким же, как и mainView. – Kingalione