Рамка, межі, центр, походження UIView, коли використовувати що?


195

UIViewмає властивості frame, bounds, centerі origin, і всі вони , як видається, пов'язані між собою . Більшу частину часу я маю справу frameпри встановленні положення та розміру а UIView. Я розумію, що frameвикористовується глобальна система координат і boundsвикористовується координата локального виду (тому її x і y дорівнюють 0, але не завжди), але все одно мене бентежить, коли використовувати що.

При якому контексті (і то , що в потрібний час) інші властивості ( bounds, center, origin) слід використовувати?


Посилання нижче має найкращу відповідь. stackoverflow.com/questions/5361369/…
Оммі

Рамка проти Bounds з фотографіями: stackoverflow.com/a/28917673/3681880
Suragch

Відповіді:


241

Відповідь Марко вище правильна, але просто для розширення питання "під яким контекстом" ...

frame - це властивість, яку ви найчастіше використовуєте для звичайних додатків iPhone. більшість елементів управління будуть викладені відносно "містять" керування, тому frame.origin безпосередньо відповідатиме тому, де потрібно відобразити управління, а frame.size визначатиме, наскільки великим буде зробити керування.

центр - це властивість, на яку ви, ймовірно, орієнтуєтесь на ігри та анімації, що базуються на спрайті, де можуть відбуватися рух чи масштабування. За замовчуванням анімація та обертання будуть базуватися на центрі UIView. Рідко має сенс намагатися керувати такими об'єктами властивістю кадру.

межі - ця властивість не є властивістю позиціонування, але визначає область, що малюється UIView, "відносно" до кадру. За замовчуванням ця властивість зазвичай (0, 0, ширина , висота ). Зміна цього властивості дозволить вам малювати поза рамкою або обмежувати малюнок на меншу площу всередині кадру. Гарне обговорення цього питання можна знайти за посиланням нижче. Нечасто цим властивістю маніпулювати, якщо немає конкретної потреби в коригуванні області малювання. Єдиним винятком є ​​те, що більшість програм використовуватиме [[UIScreen mainScreen] bounds]стартовий запуск для визначення видимої області програми та відповідно налаштування їх початкового кадру UIView.

Чому в UIView є прямокутник рамки та прямокутник з межею?

Сподіваємось, це допомагає з’ясувати обставини, коли кожна власність може звикнути.


33
Я думаю, що варто додати, що boundsзазвичай використовуються, коли у поданні застосовано перетворення. За цих обставин frameмайно не визначено. Як вказують інші відповіді, модифікація centerта boundsеквівалент зміні положення та розміру подання відповідно.
Стюарт

36

Вони пов'язані значеннями і підтримуються послідовно методами встановлення властивостей / getter (і використовуючи той факт, що кадр є чисто синтезованим значенням, не підкріпленим фактичною змінною екземпляра).

Основні рівняння:

frame.origin = center - bounds.size / 2

(що те саме)

center = frame.origin + bounds.size / 2

(і є також)

frame.size = bounds.size

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

Цей матеріал детальніше пояснюється тут корисною міні-бібліотекою:

http://bynomial.com/blog/?p=24


18

Властивості center, boundsі frameзчіплюються: зміна один оновить інші, тому використовувати їх , як ви хочете. Наприклад, замість того, щоб змінювати параметри x / y frameдля перегляду перегляду, просто оновіть centerвластивість.

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