UITextView z podświetleniem składni

Jak zrobić podświetlanie składni w UITextView, a konkretnie podświetlanie składni (i wykrywanie) dla Objective-Cna iPhonie?

Niektóre z moich pomysłów jak to zrobić:
  • NSAttributedString. Teraz dostępne w systemie iOS 3.2 i nowszym. Ale jak umieścić NSAttributedString w UITextView?
  • UIWebView. Nakładaj go po zakończeniu edycji i pokoloruj tekst arkuszami stylów CSS. Ale jak to zrobić w UIWebView, nadając mu tekst, a następnie kolorując to?
Author: Cœur, 2010-09-04

5 answers

Aktualizacja: od iOS 7 i TextKit podświetlanie składni stało się łatwe. nie szukaj dalej niż tutaj na wprowadzenie (przeze mnie).


Zakładając, że chcesz edytowalnego komponentu, nie ma zbyt wiele nadziei. Daje szybki przegląd, tylko aby upewnić się, że obejmuje wszystko:

  • UITextView: tylko zwykły tekst , bez (publicznego) obejścia. Ale edytowalny. Nie ma szans nic zmienić, nie ma szans na geometrię itd. Używa wewnętrznego widoku sieci web. Każdy akapit jest <div>, który jest zmieniany przez silnik edycji. Możesz tam zmienić DOm, ale to tylko prywatne API. Wszystkie prywatne, stąd nie ma opcji.
  • UIWebView: html , więc może być stylizowany, mieć osadzone obrazy itp. Domyślam się (bez patrzenia w to), że to jest to, co wcześniej wymienione trzy 20 UI używa. Problem: nie można edytować. Nie ma (publicznego) sposobu na obejście tego. Nie można uzyskać selekcji, dostępu do DOM, itp bez prywatnego API i wielu bólów głowy. Edycja działa jak w UITextView, ale wymaga zupełnie nowego poziomu bólu głowy. Nadal: prywatnie.
  • CoreText Framework: od iOS 3.2 bardzo dobry Rendering silnik. Ale to wszystko. Może bezpośrednio układać i renderować NSAttributesString s. jednak nie ma interakcji użytkownika. Bez zaznaczania tekstu, bez wprowadzania tekstu, bez sprawdzania pisowni, bez zamiany, bez podświetlania, Nie Nie Nie Nie Nie. Tylko rendering. I sporo pracy, aby to szybko na starych urządzeniach z długimi SMS-ami.
  • UITextInput protokół: umożliwia interakcję z klawiaturą i przechwytywanie wprowadzania tekstu. Zawiera również podstawowe zamienniki tekstu. Problem: tylko wprowadzanie tekstu, źle udokumentowane. Brak zaznaczania tekstu itp. (patrz wyżej).

Oto jesteśmy. Dwa w pełni funkcjonalne komponenty, które nie mają funkcji centralnej i dwa rozwiązania częściowe, które nie mają brakującego ogniwa. Oto wszystkie realne podejścia, które mogę wymyślić:

  • niech użytkownik edytuje UITextView i wyświetla zawartość w stylu UIWebView. Do tego ostatniego możesz użyć rzeczy Three20.
  • Zbuduj brakujące ogniwo pomiędzy CoreText i UITextInput. Obejmuje to między innymi wybór tekstu, podświetlenie, kolory tła, przechowywanie i zarządzanie tekstem, wydajność, sprawdzanie pisowni itp. Niektóre z nich są dostarczane przez frameworki systemowe, ale nadal wymagają dużej integracji.
  • Zgłoś błąd i poczekaj, aż pojawi się ładne publiczne API(moje osobiste podejście).
  • przekonaj Apple, aby zezwolił ponownie prywatne API i bałagan z UItextViewS DOM.

Grupa Omni podjęła drugie podejście i utworzyła edytowalny widok tekstu. Można go znaleźć w frameworku OmniUI . Jednak to wdrożenie jest dalekie od doskonałości. (przynajmniej wtedy, gdy ostatnio sprawdzałem kilka miesięcy temu). Starali się, ale nadal nie udało się dostać do jabłka perfekcji w interakcji użytkownika. Apple musiało zainwestować co najmniej kilka lat w interakcję tylko z interfejsem użytkownika z zaznaczeniem tekstu i edycji. Nic do zrobienia w domu, a jak się wydaje nawet dla firm jak omni group.

Jest w tym wszystkim interesujący aspekt: iWork. Apple twierdzi, że nie używa w nich żadnego prywatnego API. Ale wybór tekstu jest taki sam jak w systemie operacyjnym. Więc musieli skopiować framework source do aplikacji. Bardzo uczciwe podejście;)

 74
Author: Max Seelemann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-16 13:44:11

Od iOS 5 możesz użyć UIWebView i ustawić contenteditable="true" Na div w nim. To sprawia, że UIWebView otwiera klawiaturę i pozwala użytkownikowi bezpośrednio wprowadzać tekst do DOM. Następnie możesz napisać aplikację webową, która podświetla składnię. Możesz komunikować się z aplikacją cocoa za pomocą niestandardowych adresów URL.

Jedyny problem, jaki mam, to to, że nie umiesz sprawdzać pisowni.
 12
Author: mxcl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-27 23:45:16

Jtextview jest zamiennikiem UITextView obsługującym magazyn tekstowy NSAttributedString. Umożliwia wyświetlanie tekstu sformatowanego, ale jest niekompletny.

 2
Author: ma11hew28,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-22 14:38:10

Nie wiem zbyt wiele o wykrywaniu składni, ale jeśli chcesz mieć wiele stylów w tym samym UITextView, to Three 20 UI jest rzeczą, na którą powinieneś spojrzeć

Oto kolejne pytanie, które może cię dotyczyć: jak najlepiej zaimplementować podświetlanie składni kodu źródłowego w Cocoa. Nie jestem pewien, czy to Mac czy iPhone, ale myślę, że jeśli połączysz to i Three20, możesz mieć swój własny w iPhone. Powodzenia

 0
Author: vodkhang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:25

Jeśli ktoś nadal szuka kompletnego rozwiązania tego problemu, to znam dwie biblioteki, które to zapewniają:

  • Highlightr : Biblioteka Swift do podświetlania składni, obsługuje setki języków, ale używa JS jako zaplecza. Jest wystarczająco szybki do edycji na żywo. (Disclaimer : jestem twórcą tej biblioteki).
  • SyntaxKit : natywne rozwiązanie autorstwa sama Soffesa , ale na wczesnych etapach rozwoju. Powinien obsługiwać dowolną składnię TextMate w przyszłość. Tak powinno być, gdy Biblioteka jest wystarczająco dojrzała.
 0
Author: Raspu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-07 09:17:00