2013-06-08 4 views
2

Когда я создаю фрейм в iOS с CGRectMake(), будь то установка свойства frame или с использованием initWithFrame:, он запрашивает x, y, ширину и высоту. Я их поставляю.Как вы балансируете автоматический макет с созданием фреймов?

Но с автоматическим макетом я собираюсь сказать что-то вроде: «расположите его в середине» и «установите ширину на половину экрана», сразу после того, как я установил их с CGRectMake(), по-разному.

Что я устанавливаю их как в CGRectMake()? 0? Произвольное значение? Что-то близко к тому, что я хочу?

ответ

5

При использовании автоматической компоновки вы не должны устанавливать свойство frame. Вы можете установить frame, но нет никакой цели в этом, и только делает ваш код вводящим в заблуждение, поскольку frame будет заменен размерами, которые он вычисляет из ограничений. Я бы предложил полностью определить размеры элементов управления с использованием ограничений и полностью исключить установку frame, чтобы избежать путаницы.

Итак, если вы создаете представления программно, вместо initWithFrame, просто сделайте init. Кроме того, не забудьте установить translatesAutoresizingMaskIntoConstraints в NO и добавить все соответствующие ограничения, чтобы макет был однозначным, но без каких-либо противоречивых ограничений.

+0

Благодарим вас за отличный ответ. Вопрос: вы предпочитаете устанавливать ограничения в коде или в раскадровке? –

+0

@DougSmith Я лично считаю, что гораздо проще сделать это в раскадровке, так как это избавляет вас от сорняков, создавая все различные ограничения. Но если ваш контроль - это тот, который вам нужно добавить программно, тогда вам также необходимо создавать ограничения программно. Использование языка [визуального формата] (https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/Articles/constraintFundamentals.html#//apple_ref/doc/uid/TP40010853-CH2-SW2) часто упрощает создание программных ограничений. Но если вы можете сделать это в Interface Builder, это еще проще. – Rob