Apple досить чітко визначила, як підкласи UIView
в doc.
Ознайомтесь із списком нижче, особливо подивіться на initWithFrame:
та layoutSubviews
. Перший призначений для встановлення кадру вашого, UIView
тоді як другий призначений для встановлення кадру та компонування його підпоглядів.
Пам'ятайте також, що initWithFrame:
виклик проводиться лише в тому випадку, якщо ви створюєте UIView
програмну копію програми. Якщо ви завантажуєте його з файлу nib (або раскадровки), initWithCoder:
буде використано. А в initWithCoder:
кадрі ще не було обчислено, тому ви не можете змінити кадр, який ви створили в Interface Builder. Як було запропоновано в цій відповіді ви можете думати про виклик initWithFrame:
від initWithCoder:
того , щоб налаштувати рамку.
Нарешті, якщо ви завантажуєте свій UIView
інструмент (або дошка розкадрів), у вас також є awakeFromNib
можливість виконати власні ініціалізації кадру та макета, оскільки коли awakeFromNib
виклик гарантується, що кожен перегляд в ієрархії був неархівованим та ініціалізованим.
З doc of NSNibAwaking
(тепер замінено doc of awakeFromNib
):
Повідомлення іншим об’єктам можна безпечно надсилати з місця wakekeromromrombb - до цього часу буде впевнено, що всі об’єкти неархівовані та ініціалізовані (хоча, не обов'язково, прокидаються, звичайно)
Також варто зауважити, що при автоматичному розкладі ви не повинні чітко встановлювати рамку свого перегляду. Натомість вам слід вказати набір достатніх обмежень, щоб кадр автоматично обчислювався механізмом компонування.
Прямо з документації :
Методи перекриття
Ініціалізація
initWithFrame:
Рекомендується реалізувати цей метод. Ви також можете реалізувати власні методи ініціалізації на додаток до цього способу або замість цього.
initWithCoder:
Реалізуйте цей метод, якщо ви завантажуєте свій погляд із файлу віконця Interface Builder, а для перегляду потрібна спеціальна ініціалізація.
layerClass
Реалізуйте цей метод лише в тому випадку, якщо ви хочете, щоб ваш погляд використовував інший шар анімації Core для його резервного сховища. Наприклад, якщо для малювання ви використовуєте OpenGL ES, ви хочете змінити цей метод і повернути клас CAEAGLLayer.
Малювання та друк
drawRect:
Реалізуйте цей метод, якщо у вашому представленні малюється спеціальний вміст. Якщо у вашому представництві немає спеціального малюнка, уникайте цього методу.
drawRect:forViewPrintFormatter:
Застосовуйте цей метод лише в тому випадку, якщо під час друку ви хочете по-різному намалювати вміст вашого перегляду.
Обмеження
requiresConstraintBasedLayout
Реалізуйте цей метод класу, якщо ваш клас перегляду вимагає обмежень для належної роботи.
updateConstraints
Реалізуйте цей метод, якщо ваш погляд повинен створити спеціальні обмеження між вашими підглядами.
alignmentRectForFrame:
, frameForAlignmentRect:
Реалізуйте ці методи, щоб змінити, як ваші погляди вирівняні з іншими.
Макет
sizeThatFits:
Реалізуйте цей метод, якщо ви хочете, щоб у вашому представленні розмір за замовчуванням був іншим, ніж зазвичай, під час операцій із зміною розміру. Наприклад, ви можете використовувати цей метод, щоб запобігти зменшенню вашого перегляду до точки, коли підпогляди не можуть бути відображені належним чином.
layoutSubviews
Реалізуйте цей метод, якщо вам потрібен більш точний контроль над компонуванням ваших переглядів, ніж передбачено обмеження або автоматичне поведінку.
didAddSubview:
, willRemoveSubview:
Реалізуйте ці методи за необхідності відстеження доповнень та видалень підпрезентацій.
willMoveToSuperview:
, didMoveToSuperview
Реалізуйте ці методи за необхідності відстеження руху поточного перегляду у ієрархії перегляду.
willMoveToWindow:
, didMoveToWindow
Застосуйте ці методи за необхідності відстеження руху вашого перегляду до іншого вікна.
Обробка подій:
touchesBegan:withEvent:
, touchesMoved:withEvent:
, touchesEnded:withEvent:
, touchesCancelled:withEvent:
Реалізувати ці методи , якщо вам потрібно обробляти подія дотику безпосередньо. (Для введення на основі жестів використовуйте розпізнавачі жестів.)
gestureRecognizerShouldBegin:
Реалізуйте цей метод, якщо ваше представлення обробляє події, що торкаються безпосередньо, і, можливо, не зможе перешкодити приєднаним розпізнавачам жестів викликати додаткові дії.