Автоматизовані маски програмно проти 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 FlexibleWeight)

У XIB?

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

(UIViewAutoresizingF FlexibleWidth | UIViewAutoresizingF FlexibleHeight | UIViewAutoresizingF FlexibleLeftMargin | UIViewAutoresizingFfleRightMargin | UIViewAutoresizingFfleTopMargin | UIViewAutoresizingFfleBottomMargin)

У XIB?

Чи правильні мої 2 оновлені сценарії? Я зараз в розумінні?


3
Ти що, жартуєш? Але, здається, там і моя плутанина. Тож якщо я хочу обійняти верх, я включаю нижню автоматичну розмір. Гарне завдання яблуко. Це сама ідіотська установка, яку я коли-небудь бачив.
user4951

1
Якщо ви хочете обійняти верх, вам потрібно переконатися, що ви не згадаєте UIViewAutoresizingFfleTopMargin у коді бітової маски. Моє попереднє припущення було неправильним, і саме тому я поставив це питання, щоб очистити речі.
Радж Паван Гумдал

Ваше припущення правильне. Де ви помиляєтесь?
user4951

Так, два сценарії, які ви цитуєте, є правильними.

3
Я створив для цього простий інструмент: erkanyildiz.me/lab/autoresizingmask ви можете ним користуватися.
erkanyildiz

Відповіді:


35

Так, у Interface Builder це "перевернуто" в певному сенсі (або UIView, залежно від того, як ви на це дивитесь). Ваші цитовані "сценарії" правильні.


47

Так, ви правильно сказали речі. Крім того, я погоджуюся, що це відчувається трохи назад, тому я ціную ваш пост.

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

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

Використання UIViewAutoresizingFlexibleMarginsзробить елемент інтерфейсу користувача зосередженим, оскільки він НЕ буде обіймати жодну сторону. Щоб змусити елемент зростати / стискатися з його батьківським, встановіть відповідно UIViewAutoresizingFlexibleWidthі UIViewAutoresizingFlexibleHeight.

Мені подобається використовувати, UIViewAutoresizingFlexibleMarginsтому що згодом я можу посилатися на це так:

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

замість

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

Все часто я бачу ці поля АБО спільно на одному рядку, як приклад вище. Просто важко читати.


4
Гнучка в будь-якому напрямку повинна бути (UIViewAutoresizingFfleWidth | UIViewAutoresizingFfleHeight) Я думаю? Або я знову плутаюсь!
Радж Паван Гумдал

4
FlexibleMargins змусить елемент залишитися в центрі (не обіймаючи лівий, верхній, правий або нижній край). Гнучка ширина / висота змусить елемент ui рости / скорочуватися відповідно.
Сем

4
Чи все зрозуміло зараз? Крім того, я дійсно мав на увазі це, коли я сказав, що я оцінюю ваш пост. Я насправді віддав перевагу б / с, це заплутало мене в минулому. Я думаю, що це чудовий запитання.
Сем,

3
Так, дякую, зараз я отримую це "Гнучкі поля" та "Гнучка ширина / висота". Це пояснює все це, і ваше "не обіймати ліву, верхню, праву чи нижню межі" - це хороший спосіб пояснити :)
Радж Паван Гумдал

0

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

Увімкнення вертикальної / горизонтальної стрілки (званої пружиною) всередині коробки зробить висоту / ширину гнучким. Але включення зовнішньої лінії (званої підпірки) зробить цю сторону негнучкою / негнучкою.

Увімкнення зовнішньої лівої лінії (ліва підкоса) не є рівносильною UIViewAutoresizingFlexibleRightMargin. Натомість UIViewAutoresizingFlexibleRightMargin= увімкнено, якщо права стійка вимкнена, вимкнена, якщо права підпірка включена.

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


0

Swift 4 використовує це

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

Ціль-С

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.