При використанні автоматичного макета в коді, встановлення кадру нічого не робить. Тож той факт, що ви вказали ширину 200 у поданні вище, нічого не означає, коли ви встановлюєте для нього обмеження. Щоб набір обмежень подання був однозначним, йому потрібні чотири речі: положення х, положення у, ширина та висота для будь-якого даного стану.
Наразі у наведеному вище коді у вас лише два (висота щодо супервигляду та позиція у відносно супервигляду). На додаток до цього, у вас є два необхідні обмеження, які можуть конфліктувати залежно від того, як налаштовані обмеження суперпогляду представлення даних. Якщо супервигляд мав би необхідне обмеження, яке вказує, що його висота має якесь значення менше 748, ви отримаєте виняток "незадоволені обмеження".
Той факт, що ви встановили ширину подання до встановлення обмежень, нічого не означає. Він навіть не братиме до уваги старий кадр і буде обчислювати новий кадр, виходячи з усіх обмежень, які він вказав для цих подань. Маючи справу з авторозкладкою в коді, я зазвичай просто створюю нове представлення за допомогою initWithFrame:CGRectZero
або просто init
.
Щоб створити набір обмежень, необхідний для макета, який ви словесно описали у своєму питанні, вам потрібно буде додати деякі горизонтальні обмеження для обмеження ширини та положення x, щоб надати повністю заданий макет:
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:[myView(==200)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
Вербальний опис цього макета читається наступним чином, починаючи з вертикального обмеження:
myView заповнить висоту свого супервигляду верхньою та нижньою відступами, рівними стандартному пробілу. Мінімальна висота супервигляду myView - 748 пунктів. Ширина myView становить 200 балів і має правий відступ, що дорівнює стандартному пробілу проти його супервигляду.
Якщо ви просто хочете, щоб подання заповнювало всю висоту нагляду без обмеження висоти нагляду, тоді ви просто пропустили б (>=748)
параметр у тексті візуального формату. Якщо ви вважаєте, що (>=748)
параметр потрібен для того, щоб надати йому висоту - у цьому випадку ви цього не робите: закріпивши подання до країв суперперегляду за допомогою синтаксису bar ( |
) або bar with space ( |-
, -|
), ви надаєте своєму виду y -позиція (закріплення подання на одному ребрі) та позиція y з висотою (закріплення подання на обох краях), таким чином задовольняючи ваші обмеження для подання.
Щодо Вашого другого питання:
Використовуючи NSDictionaryOfVariableBindings(self.myView)
(якщо у вас була установка властивості для myView) та подаючи це у ваш VFL для використання self.myView
у вашому тексті VFL, ви, ймовірно, отримаєте виняток, коли авторозкладка намагається проаналізувати ваш текст VFL. Це пов’язано з позначенням крапок у ключах словника та системою, яка намагається використовувати valueForKeyPath:
. Дивіться тут подібне запитання та відповідь .