Как сделать 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, что означает, что реализация может быть скорее беспорядком для того, чтобы пройти этот переход.

В любом случае, некоторые вещи указывают вам правильное (или хотя бы) направление:

Я извиняюсь, что этот ответ, вероятно, не так полезен, как я хотел. По сути: это действительно большой вопрос; это, наверное, несколько действительно важных вопросов.

Вы можете использовать приведенные ниже источники, чтобы понять, что происходит под капотом. Однако реализация Apple'e не обязательно должна быть такой же.

https://github.com/BigZaphod/Chameleon/blob/master/UIKit/Classes/UITextView.h https://github.com/BigZaphod/Chameleon/blob/master/UIKit/Classes/UITextView.m

Другие вопросы по тегам