Ответ 1
Да, интерфейс Builder имеет "обратный" в некотором смысле (или UIView, в зависимости от того, как вы смотрите на него). Ваши приведенные "сценарии" верны.
Я был в (возможно, ложном) предположении, что включение указателя правого поля в xib эквивалентно использованию UIViewAutoresizingFlexibleLeftMargin
внутреннего кода и т.д.
Итак, я думал по этому снимку:
Позже сегодня мне пришлось перекреститься, и наткнулся на этот поток.
И также документация на яблоко, озаглавленная в разделе с заголовком - "Обработка изменений макета автоматически с использованием правил авторезистирования" в этой ссылке: https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews.html
Итак, теперь у меня есть обновленная концепция в моем понимании того, как программная настройка автоматической маскировки будет эквивалентна настройкам xib:
Сценарий 1:
Установка только (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)
эквивалентна:
В XIB?
Сценарий 2:
Установка (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)
в коде эквивалентна:
В XIB?
Правильны ли мои 2 обновленные сценарии? Я прямо сейчас в своем понимании?
Да, интерфейс Builder имеет "обратный" в некотором смысле (или UIView, в зависимости от того, как вы смотрите на него). Ваши приведенные "сценарии" верны.
Да, вы правильно процитировали. Кроме того, я согласен, что он чувствует себя немного в обратном направлении, поэтому по этой причине я ценю ваш пост.
Вам может потребоваться использование препроцессора 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 вместе на одной строке, как в примере выше. Просто трудно читать.
Включение вертикальной/горизонтальной стрелки (называемой spring) внутри поля сделает гибкость по высоте/ширине. Но включение внешней линии (называемой стойкой) сделает эту сторону негибкой/негибкой.
Включение внешней левой строки (левая стойка) не эквивалентно включению UIViewAutoresizingFlexibleRightMargin
. Вместо этого UIViewAutoresizingFlexibleRightMargin
= на, если правая стойка отключена, выкл, если включена правая стойка.
Вначале это сбивает с толку, но если вы видите внимательно, есть разница в пружинах и стойках. Я не знаю, почему Apple сделала это, но для меня были случаи, когда это было проще в использовании. И использование противоположных свойств в коде еще более запутанно.
Swift 4 используют это
gadBannerView?.autoresizingMask = [.flexibleRightMargin , .flexibleLeftMargin , .flexibleTopMargin , .flexibleBottomMargin]
Objective-C
myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;