← Назад к вопросам

Сколько инициализаторов есть у view?

1.3 Junior🔥 142 комментариев
#UIKit и верстка

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Инициализаторы UIView: полный обзор

У класса UIView в iOS есть несколько инициализаторов, которые можно разделить на стандартные унаследованные от NSObject/UIResponder и специальные, предназначенные для работы с фреймворком UIKit. Основных публичных инициализаторов, которые непосредственно используются при создании вью, всего два, но важно понимать их иерархию и варианты использования.

Основные публичные инициализаторы UIView

  1. init(frame: CGRect) - Основной и наиболее часто используемый инициализатор

    Создает вью с заданной рамкой (frame). Это предпочтительный способ программного создания UIView, особенно если вы сразу знаете его размер и положение.

    let customView = UIView(frame: CGRect(x: 20, y: 20, width: 100, height: 100))
    customView.backgroundColor = .blue
    

    Важно: При использовании Auto Layout, frame, заданный в этом инициализаторе, часто игнорируется или пересчитывается системой лейаута. Однако сам инициализатор остается стандартным.

  2. init?(coder: NSCoder) - Инициализатор для декодирования из Storyboard/XIB

    Это required инициализатор, который вызывается, когда вью создается из интерфейсного файла (Storyboard или XIB). Если вы создаете кастомную вью, которая будет использоваться в Interface Builder, вы обязаны реализовать его (часто вместе с init(frame:)).

    class CustomView: UIView {
        // Для программного создания
        override init(frame: CGRect) {
            super.init(frame: frame)
            commonInit()
        }
        
        // Для создания из Storyboard/XIB
        required init?(coder: NSCoder) {
            super.init(coder: coder)
            commonInit()
        }
        
        private func commonInit() {
            // Общая настройка вью
            self.backgroundColor = .systemBackground
            // Добавление сабвью, настройка и т.д.
        }
    }
    

Технически доступные инициализаторы

Помимо двух основных, UIView наследует другие инициализаторы по цепочке наследования:

  1. init() - Унаследован от NSObject

    Хотя технически он доступен, в контексте UIView использовать его не рекомендуется. Он создает вью с frame .zero, но может привести к неочевидным проблемам, особенно при работе с Auto Layout. Лучше всегда использовать init(frame: .zero) для явности.

    // Не рекомендуется, но работает
    let view = UIView()
    view.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
    
    // Лучше так
    let view = UIView(frame: .zero)
    // Затем настроить констрейнты
    

Специальные случаи и дизайнированные инициализаторы

  • Для подклассов UIView: Когда вы создаете кастомную вью, вы часто реализуете оба основных инициализатора (init(frame:) и init?(coder:)), вынося общую логику инициализации в отдельный метод (как commonInit() в примере выше).

  • Инициализаторы конкретных сабклассов: Конкретные виды вью (например, UILabel, UIButton) могут иметь свои дополнительные инициализаторы:

    // UIButton имеет специальный инициализатор
    let button = UIButton(type: .system)
    
    // UILabel можно создать с frame
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 40))
    

Практические рекомендации по использованию

  • Для программного создания всегда используйте init(frame:). Даже если вы используете Auto Layout и frame будет .zero, это явно указывает на намерения.

    // Правильно
    let view = UIView(frame: .zero)
    view.translatesAutoresizingMaskIntoConstraints = false
    parentView.addSubview(view)
    // Настройка констрейнтов
    
  • Для кастомных вью, используемых в Interface Builder, реализуйте оба инициализатора и выносите общую настройку в отдельный метод, чтобы избежать дублирования кода.

  • Избегайте init(), так как это может скрыть проблемы на этапе инициализации, особенно в сложных иерархиях вью.

Итого

Если считать только публичные инициализаторы, предназначенные непосредственно для создания UIView, то их два основных:

  1. init(frame: CGRect)
  2. init?(coder: NSCoder)

Плюс один унаследованный (init()), использование которого не рекомендуется в контексте UIView. Правильное понимание и использование этих инициализаторов критически важно для создания стабильных, правильно инициализированных пользовательских интерфейсов в iOS-приложениях.