Как я могу зарегистрировать CustomLayoutManager при создании экземпляра UITextView из раскадровки
Я хочу адаптироваться CustomeLayoutManager
в UITextView
, Итак, я сделал подкласс (CustomTextView
) из UITextView
,
final class CustomTextView: UITextView {
override init(frame: CGRect, textContainer: NSTextContainer?) {
let storage = NSTextStorage()
let layout = CustomLayoutManager()
storage.addLayoutManager(layout)
let container = NSTextContainer()
container.widthTracksTextView = true
layout.addTextContainer(container)
super.init(frame: frame, textContainer: container)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
CustomTextView
сгенерированный кодом работает нормально. Однако я не знаю, как адаптировать CustomLayoutManager
когда экземпляр создается из stroyboard
Благодарю.
2 ответа
Вы можете установить пользовательский класс в раскадровке, щелкнув Identity Inspector на правой панели и введя имя пользовательского класса в поле "Class".
Также вам необходимо реализовать код инициализации в обоих методах инициализации.
init(frame:) is called whenever you create a view(or subclass) object using UIView(frame:) method.
init(coder:) is called whenever your view(or subclass) is created from the storyboard.
- В вашей раскадровке выберите ваш
UITextView
, - Выберите инспектора идентичности (правая панель) и укажите имя класса как
CustomTextView
,
Теперь, когда ваша раскадровка создает объект textView
это будет типа CustomTextView
,
редактировать
Таким образом, проблема воспроизводима. init
не вызывается, когда вы instantaite от раскадровки, но init(coder:)
называется. Кажется, вы должны сделать это программно.