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: Реалізуйте цей метод, якщо ваше представлення обробляє події, що торкаються безпосередньо, і, можливо, не зможе перешкодити приєднаним розпізнавачам жестів викликати додаткові дії.