UITextView с подсветкой синтаксиса - PullRequest
39 голосов
/ 04 сентября 2010

Как сделать подсветку синтаксиса в UITextView, в частности подсветку синтаксиса обнаружение ) для Objective-C на iPhone ?

Некоторые из моих идей о том, как это сделать:

  • NSAttributedString.Теперь доступно в iOS 3.2 и выше.Но как бы я поместил NSAttributedString в UITextView?
  • UIWebView.Наложите его, когда пользователь закончит редактирование, и раскрасьте текст таблицами стилей CSS.Но как мне сделать это в UIWebView, дать ему текст и затем раскрасить его?

Ответы [ 5 ]

74 голосов
/ 04 сентября 2010

ОБНОВЛЕНИЕ: Начиная с iOS 7 и TextKit , подсветка синтаксиса стала легкой, как пирог. Смотрите не дальше для ознакомления (мной).


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

  • UITextView: простой текст * только 1015 *, без (публичного) обхода.Но редактируемый .Нет возможности что-либо изменить, нет возможности получить геометрию и т. Д. Внутренне использует веб-представление.Каждый абзац представляет собой <div>, который изменяется механизмом редактирования.Вы можете изменить DOm там, но это все частный API.Все закрытое, поэтому никаких опций нет.
  • UIWebView: html , поэтому его можно стилизовать, иметь встроенные изображения и т. Д. Я предполагаю (не глядя на это), чторанее упоминалось три 20 пользовательского интерфейса.Проблема: невозможно редактировать .Там нет (публичный) способ обойти это.Вы не можете получить выбор, получить доступ к DOM и т. Д. Без частного API и большого количества головной боли.Редактирование будет работать как в UITextView, но требует совершенно нового уровня головной боли.Тем не менее: private.
  • CoreText Framework: Начиная с iOS 3.2 очень очень хороший рендеринг движок.Но это все.Может непосредственно макет и рендеринг NSAttributesString с.Тем не менее, нет никакого взаимодействия с пользователем.Без выделения текста, без ввода текста, без проверки орфографии, без замены, без выделения, нет, нет, нет, нет.Просто рендеринг.И довольно много работы, чтобы сделать это быстро на старых устройствах с длинными текстами.
  • UITextInput Протокол: позволяет взаимодействовать с клавиатурой и захватывать ввод текста .Также имеется базовая замена текста.Проблема: только ввод текста, плохо документировано.Нет выделения текста и т. Д. (См. Выше).

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

  • Попросите пользователя отредактировать UITextView без стиля и отобразить содержимое в стиле UIWebView.Для последнего вы можете использовать вещь Three20.
  • Постройте недостающее звено между CoreText и UITextInput.Это включает, но не ограничивается этим, выбор текста, выделение, цвета фона, хранение и управление текстом, эффективность, проверку орфографии и т. Д. Некоторые из них предоставляются системными платформами, но все еще требуют большой интеграции.
  • Отправьте сообщение об ошибке и дождитесь появления публичного API (мой личный подход).
  • Убедите Apple снова разрешить использование частного API и связываться с UItextView s DOM.

Omni Group выбрала второй подход и создала редактируемое текстовое представление.Вы можете найти его в OmniUI framework.Однако эта реализация далека от совершенства.(по крайней мере это было, когда я последний раз проверял несколько месяцев назад).Они изо всех сил старались, но все же не смогли достичь совершенства Apple в взаимодействии с пользователем.Apple, должно быть, потратила не менее нескольких человеко-лет на то, чтобы взаимодействовать только с пользовательским интерфейсом с выделением и редактированием текста.Ничего не поделаешь дома, и, как кажется, даже для компаний, таких как omni group.

Во всем этом есть интересный аспект: iWork.Apple утверждает, что не использует в них никаких частных API.Но выбор текста тот же, что и в ОС.Таким образом, они должны были скопировать источник фреймворка в приложения.Очень честный подход;)

12 голосов
/ 28 октября 2011

Начиная с iOS 5, вы можете использовать UIWebView и установить contenteditable="true" в div в нем. Это заставляет UIWebView открывать клавиатуру и позволяет пользователю напрямую вводить текст в DOM. Затем вы можете написать веб-приложение, которое делает подсветку синтаксиса. Вы можете общаться с приложением какао с помощью пользовательских URL-адресов.

Единственная проблема, которую я имею, это то, что вы, похоже, не проверяете орфографию.

2 голосов
/ 22 января 2012

JTextView - это замена UITextView, которая поддерживает текстовое хранилище NSAttributedString. Позволяет отображать форматированный текст, но не является полным.

1 голос
/ 07 сентября 2016

Если кто-то все еще ищет полное решение для этого, я знаю две библиотеки, которые обеспечивают это:

  • Highlightr : библиотека Swift для подсветки синтаксиса, поддерживает сотни языков, но использует JS в качестве бэкэнда. Это достаточно быстро для живого редактирования, хотя. ( Отказ от ответственности : я создатель этой библиотеки).
  • SyntaxKit : нативное решение Sam Soffes , но на ранних стадиях разработки. Должен поддерживать любой синтаксис TextMate в будущем. Это должен быть путь, когда библиотека достаточно зрелая.
0 голосов
/ 04 сентября 2010

Я не знаю много об обнаружении синтаксиса, но если вы хотите иметь несколько стилей в одном и том же UITextView, тогда Три 20 интерфейса - это то, на что вы должны обратить внимание

Вот еще один вопрос, который может касаться вас: Как лучше всего реализовать подсветку синтаксиса исходного кода в Какао . Я не уверен, что это Mac или iPhone, но я думаю, что если вы объедините это и Three20, то вы можете иметь свое собственное в iPhone. Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...