Как управлять CALayer внутри View Class.

Возможно, вы знаете, что в приложениях iOS есть множество представлений, таких как текстовые представления, текстовые поля, кнопки, представления таблиц и т. Д. Все эти представления имеют что-то общее между собой. Все эти представления используют другой класс, класс CALayer. Например, если вы хотите добавить рамку к кнопке, вы просто вызываете:

button.layer.borderWidth = 1

когда вы хотите добавить радиус к углам границы, вы вызываете:

button.layer.cornerRadius = 5

В приведенных выше примерах вы должны вызвать слой, потому что слой отвечает за визуализацию вида, такого как граница, цвета и т. Д.

Добавление нижней строки к виду

Проблема в том, что вы хотите нарисовать свой слой, например, нижнюю строку в текстовых полях.

Я потратил много времени на размышления о том, почему мой CALayer не вызывается (я пытался вызвать это внутри функции init). Ответ был основан на документации Apple.

Всякий раз, когда размер представления изменяется, UIKit применяет поведение автоизменения размеров вложенных представлений этого представления, а затем вызывает метод layoutSubviews представления, чтобы позволить ему вносить изменения вручную. Вы можете реализовать метод layoutSubviews в пользовательских представлениях, когда поведение автоизменения размеров само по себе не дает желаемых результатов. Ваша реализация этого метода может выполнять одно из следующих действий:

- Отрегулируйте размер и положение любых немедленных подвидов.

- Добавить или удалить субпредставления или слои базовой анимации.

- Принудительно перерисовать подвид, вызвав его метод setNeedsDisplay или setNeedsDisplayInRect:.

Поэтому, когда вы создаете свой класс в представлении, вы должны переопределить layoutSubviews () и внутри этой функции добавить подслой в ваше представление. В этом примере показано, как добавить нижнюю строку в текстовое поле.

Следует помнить об одном 👨🏼‍💻

Если вы хотите добавить свой собственный слой непосредственно внутри класса UIViewController, вы не можете использовать layoutSubviews (), вместо этого вы должны переопределить viewDidLayoutSubviews ().