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

216

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

Итак, я привык думать по этому снимку: введите описание изображения здесь

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

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

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

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

(UIViewAutoresizingF FlexibleWidth | UIViewAutoresizingF flexHeight)

В XIB?

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

.

В XIB?

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

Радж Паван Гумдал
источник
3
Ты издеваешься надо мной? Но, похоже, и здесь моя путаница. Поэтому, если я хочу обнять верх, я включаю авторазмер дна. Хорошая работа, яблоко. Это самая идиотская установка, которую я когда-либо видел.
user4951
1
Если вы хотите обнять сверху, вы должны убедиться, что вы не упомянете UIViewAutoresizingF FlexibleTopMargin в коде битовой маски. Мое предыдущее предположение было неверным, и именно поэтому я разместил этот вопрос, чтобы прояснить ситуацию.
Радж Паван Гумдал
Ваше предположение верно. Где ты не прав?
user4951
Да, два приведенных вами сценария верны.
3
Я сделал для этого простой инструмент: erkanyildiz.me/lab/autoresizingmask Вы можете использовать его.
erkanyildiz

Ответы:

35

Да, Интерфейсный Разработчик в некотором смысле «перевернул» (или UIView, в зависимости от того, как вы на это смотрите). Ваши приведенные "сценарии" верны.

DarkDust
источник
47

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

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

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

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

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

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

вместо того

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

Часто я вижу эти поля ИЛИ вместе на одной строке, как в примере выше. Просто трудно читать.

Сэм
источник
4
Я думаю, что гибкость в каждом направлении должна быть (UIViewAutoresizingF FlexibleWidth | UIViewAutoresizingF FlexibleHeight)? Или я снова запутался!
Радж Паван Гумдал
4
FlexibleMargins заставит элемент оставаться в центре (не обнимая левое, верхнее, правое или нижнее поле). Гибкая ширина / высота заставит элемент пользовательского интерфейса увеличиваться / уменьшаться соответственно.
Сэм
4
Теперь все ясно? Кроме того, я действительно имел в виду, когда я сказал, что оценил ваш пост. Я действительно одобрил это, потому что это смутило меня в прошлом. Я думаю, что это отличная Q.
Сэм
3
Да, спасибо, теперь я понимаю, «Гибкие поля» и «Гибкая ширина / высота». Это все объясняет, и ваше «не обнимая левое, верхнее, правое или нижнее поле» - хороший способ объяснить :)
Радж Паван Гумдал
0

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

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

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

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

Абдуррахман Мубин Али
источник
0

Swift 4 использовать это

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

Objective-C

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
Мухаммед Наяб
источник