UITextView z podświetleniem składni
Jak zrobić podświetlanie składni w UITextView
, a konkretnie podświetlanie składni (i wykrywanie) dla Objective-C
na iPhonie?
-
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ć wUIWebView
, nadając mu tekst, a następnie kolorując to?
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 styluUIWebView
. Do tego ostatniego możesz użyć rzeczy Three20. - Zbuduj brakujące ogniwo pomiędzy
CoreText
iUITextInput
. 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
UItextView
S 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;)
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.
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.
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
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.
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