Авторезизация маски программно vs Interface Builder/xib/nib

Я был в (возможно, ложном) предположении, что включение указателя правого поля в xib эквивалентно использованию UIViewAutoresizingFlexibleLeftMargin внутреннего кода и т.д.

Итак, я думал по этому снимку: enter image description here

Позже сегодня мне пришлось перекреститься, и наткнулся на этот поток.

И также документация на яблоко, озаглавленная в разделе с заголовком - "Обработка изменений макета автоматически с использованием правил авторезистирования" в этой ссылке: https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews.html

Итак, теперь у меня есть обновленная концепция в моем понимании того, как программная настройка автоматической маскировки будет эквивалентна настройкам xib:

Сценарий 1: Установка только (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight) эквивалентна:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)

В XIB?

Сценарий 2: Установка (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin) в коде эквивалентна:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)

В XIB?

Правильны ли мои 2 обновленные сценарии? Я прямо сейчас в своем понимании?

Ответ 1

Да, интерфейс Builder имеет "обратный" в некотором смысле (или UIView, в зависимости от того, как вы смотрите на него). Ваши приведенные "сценарии" верны.

Ответ 2

Да, вы правильно процитировали. Кроме того, я согласен, что он чувствует себя немного в обратном направлении, поэтому по этой причине я ценю ваш пост.

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

#define UIViewAutoresizingFlexibleMargins                 \
              UIViewAutoresizingFlexibleBottomMargin    | \
              UIViewAutoresizingFlexibleLeftMargin      | \
              UIViewAutoresizingFlexibleRightMargin     | \
              UIViewAutoresizingFlexibleTopMargin

Использование UIViewAutoresizingFlexibleMargins приведет к тому, что элемент элемента UI останется центрированным, так как он НЕ будет обнимать ни одну сторону. Чтобы заставить элемент расти/сжиматься с его родителем, установите UIViewAutoresizingFlexibleWidth и UIViewAutoresizingFlexibleHeight соответственно.

Мне нравится использовать UIViewAutoresizingFlexibleMargins, потому что я могу позже ссылаться на него так:

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

вместо

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;

Всем часто я вижу эти поля OR'ed вместе на одной строке, как в примере выше. Просто трудно читать.

Ответ 3

введите описание изображения здесь

Включение вертикальной/горизонтальной стрелки (называемой spring) внутри поля сделает гибкость по высоте/ширине. Но включение внешней линии (называемой стойкой) сделает эту сторону негибкой/негибкой.

Включение внешней левой строки (левая стойка) не эквивалентно включению UIViewAutoresizingFlexibleRightMargin. Вместо этого UIViewAutoresizingFlexibleRightMargin= на, если правая стойка отключена, выкл, если включена правая стойка.

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

Ответ 4

Swift 4 используют это

gadBannerView?.autoresizingMask = [.flexibleRightMargin  , .flexibleLeftMargin , .flexibleTopMargin , .flexibleBottomMargin]

Objective-C

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;