Мой подход к созданию пользовательских компонентов UIView следует чёткому разделению ответственности между рисованием, раскладкой и взаимодействием.
Переопредели draw(_ rect: CGRect) для выполнения пользовательского рендеринга с помощью Core Graphics:
override func draw(_ rect: CGRect) {
guard let context = UIGraphicsGetCurrentContext() else { return }
context.setFillColor(UIColor.blue.cgColor)
context.fill(rect)
}
Используй это только когда действительно необходимо — предпочитай добавлять subviews для большинства UI-композиции.
layoutSubviews() для ручного позиционирования subviews, когда требуется раскладка на основе фреймовintrinsicContentSize для корректной поддержки Auto Layout:override var intrinsicContentSize: CGSize {
return CGSize(width: 100, height: 50)
}
invalidateIntrinsicContentSize() каждый раз, когда размер контента изменяетсяДля представлений, построенных из subviews, настрой всё в инициализаторе:
init(frame:) и init?(coder:)draw(_:) для лучшей производительностиОбрабатывай touch-события, переопределяя методы UIResponder:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { }
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { }
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { }
Для стандартных взаимодействий предпочитай использовать UIGestureRecognizer, так как он более переиспользуемый и компонуемый.
setNeedsDisplay() для инициирования перерисовки и setNeedsLayout() для инициирования проходов раскладкиМетод draw(_:) следует использовать для добавления и позиционирования subviews, а layoutSubviews() должен обрабатывать пользовательский рендеринг с помощью Core Graphics.
Новый — ещё не проверен сообществом
Вы