Ответ 1
Apple четко определила, как подкласс UIView
в документе.
Ознакомьтесь с приведенным ниже списком, особенно посмотрите initWithFrame:
и layoutSubviews
. Первый предназначен для настройки фрейма вашего UIView
, тогда как последний предназначен для установки фрейма и макета его подзонов.
Также помните, что initWithFrame:
вызывается только в том случае, если вы программно создаете свой UIView
. Если вы загрузите его из файла nib (или раскадровки), будет использоваться initWithCoder:
. И в initWithCoder:
кадр еще не рассчитан, поэтому вы не можете изменить кадр, который вы создали в Interface Builder. Как было предложено в этом ответе, вы можете придумать вызов initWithFrame:
из initWithCoder:
для настройки фрейма.
Наконец, если вы загрузите UIView
из nib (или раскадровки), у вас также есть возможность awakeFromNib
выполнить пользовательские инициализации фрейма и макета, так как при вызове awakeFromNib
гарантируется, что каждое представление в иерархия была распакована и инициализирована.
Из документа NSNibAwaking
Сообщения для других объектов могут быть отправлены безопасно из awakeFromNib, и к этому времени он гарантирует, что все объекты будут разрхивированы и инициализированы (хотя и не обязательно пробуждены, конечно)
Также стоит отметить, что при автозапуске вы не должны явно указывать рамку своего представления. Вместо этого вы должны указать набор достаточных ограничений, чтобы кадр автоматически вычислялся механизмом компоновки.
Прямо от documentation:
Методы переопределения
Инициализация
initWithFrame:
Рекомендуется реализовать этот метод. Вы также можете реализовать пользовательские методы инициализации в дополнение к, или вместо этого метода.
initWithCoder:
Внедрите этот метод, если вы загружаете свой вид из файла nib файла Interface Builder, и ваше представление требует пользовательских инициализации.
layerClass
Внедрите этот метод, только если вы хотите, чтобы ваше представление использовало другой уровень Core Animation для своего хранилища. Например, если вы используете 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:
Внедрите этот метод, если ваш взгляд обрабатывает события касания напрямую и может распознаватели жестов запускают дополнительные действия.