Как сделать UITextView с нуля?
Как я понимаю, Apple не предоставляет исходный код для UIKit. Чтобы ответить на другой вопрос, я пытаюсь понять, как UITextView
работает (или мог бы работать) под капотом.
Как бы я настроить минимальный UITextView
себя?
Из документации видно, что она наследуется от UIScrollView
поэтому я предполагаю, что я бы начал там.
import UIKit
class MyUITextView: UIScrollView {
// ???
}
Снова, глядя на документы с текстовым представлением, похоже, что мне нужно как минимум реализовать init
метод и text
имущество. (Я могу пока игнорировать все аспекты редактирования и атрибуты форматирования.)
init
Метод принимает следующую форму:
init(frame frame: CGRect, textContainer textContainer: NSTextContainer?)
Так что мне также понадобится собственность для NSTextContainer
, это TextKit
Компонент работает вместе с NSTextStorage
а также NSLayoutManager
так что мне нужно работать с кем-то тоже. Я мог бы установить NSTextStorage
с text
собственность, но я действительно не знаю, как NSLayoutManager
будет взаимодействовать здесь.
Has anyone (outside of Apple) done this before? Is this a simple enough question to answer here or would the answer be to long?
Обновить:
This question shows my latest attempt: How to Initialize NSTextStorage with a String in Swift
2 ответа
Это определенно сложно. Я должен был переопределить часть UILabel раньше, и это было сложно. Я думаю, что первое, о чем вы должны подумать, это то, на каком уровне вы заинтересованы работать. UITextView
отвечает за управление контекстом растровой графики и превращение строки в пиксели на экране. Это само по себе является довольно сложной задачей, и если вы хотите переопределить эту функциональность с нуля, вы будете на какое-то время заняты.
На более высоком уровне UITextView
выполняет такие вещи, как разбиение текста на строки, отображение разных шрифтов; еще выше, и у вас есть такие вещи, как протокол UITextInput, который позволяет пользователю вводить и управлять содержимым текстового представления.
Что касается деталей реализации, то они явно недоступны. Самое близкое, что мы можем получить - это дамп заголовка, который интересен, но может не сказать нам много.
До iOS7 и TextKit рендеринг текста фактически осуществлялся WebKit, что означает, что реализация может быть скорее беспорядком для того, чтобы пройти этот переход.
В любом случае, некоторые вещи указывают вам правильное (или хотя бы) направление:
- Ссылка на класс NSAttributedString, особенно UIKit Additions, которая позволяет вам фактически вставлять текст в графический контекст;
- Представляем TextKit, пример кода из WWDC13 (также есть сопровождающее видео)
- Введение в текстовый комплект из AppCoda.
Я извиняюсь, что этот ответ, вероятно, не так полезен, как я хотел. По сути: это действительно большой вопрос; это, наверное, несколько действительно важных вопросов.
Вы можете использовать приведенные ниже источники, чтобы понять, что происходит под капотом. Однако реализация Apple'e не обязательно должна быть такой же.
https://github.com/BigZaphod/Chameleon/blob/master/UIKit/Classes/UITextView.h https://github.com/BigZaphod/Chameleon/blob/master/UIKit/Classes/UITextView.m