Używam wystąpienie UIWebView
przetworzyć tekst i kolor to poprawnie, to daje wynik w postaci HTML, ale zamiast wyświetlania go w UIWebView
chcę, aby wyświetlić go przy użyciu Core Text
z NSAttributedString
.
Jestem w stanie utworzyć i narysować, NSAttributedString
ale nie jestem pewien, jak mogę przekonwertować i zmapować kod HTML na przypisany ciąg.
Rozumiem, że pod Mac OS X NSAttributedString
ma initWithHTML:
metodę, ale był to tylko dodatek do Maca i nie jest dostępny dla iOS.
Wiem też, że jest podobne pytanie, ale nie ma na nie odpowiedzi, pomyślałem, że spróbuję jeszcze raz i zobaczę, czy ktoś stworzył sposób, aby to zrobić, a jeśli tak, to czy mógłby się nim podzielić.
Odpowiedzi:
W iOS 7 UIKit dodał
initWithData:options:documentAttributes:error:
metodę, która może zainicjować zaNSAttributedString
pomocą HTML, np:W Swift:
źródło
Istnieje dodatek open source w toku do NSAttributedString autorstwa Olivera Drobnika na Github. Używa NSScanner do analizy HTML.
źródło
Tworzenie NSAttributedString z HTML musi być wykonane w głównym wątku!
Aktualizacja: Okazuje się, że renderowanie HTML przez NSAttributedString zależy od WebKit pod maską i musi być uruchomione w głównym wątku lub czasami powoduje awarię aplikacji z SIGTRAPem .
Dziennik awarii nowego reliktu:
Poniżej znajduje się zaktualizowane, bezpieczne wątkowo rozszerzenie ciągów Swift 2:
Stosowanie:
Wynik:
źródło
Szybkie rozszerzenie inicjatora na NSAttributedString
Chciałem dodać to
NSAttributedString
raczej jako rozszerzenie niżString
. Wypróbowałem to jako rozszerzenie statyczne i inicjator. Wolę inicjalizator, który zamieściłem poniżej.Szybki 4
Szybki 3
Przykład
źródło
guard ... NSMutableAttributedString(data:...
natry self.init(data:...
(i dodajthrows
do init)To jest
String
rozszerzenie napisane w Swift, aby zwrócić ciąg HTML jakoNSAttributedString
.Używać,
W powyższym celowo dodałem Unicode \ u2022, aby pokazać, że renderuje on kod Unicode poprawnie.
Proste: domyślne kodowanie
NSAttributedString
toNSUTF16StringEncoding
(nie UTF8!).źródło
Dokonałem pewnych modyfikacji w rozwiązaniu Andrew i zaktualizowałem kod do Swift 3:
Ten kod używa teraz UITextView jako
self
i może dziedziczyć oryginalną czcionkę, rozmiar czcionki i kolor tekstuUwaga:
toHexString()
to rozszerzenie stądPrzykładowe użycie:
źródło
Wersja Swift 3.0 Xcode 8
źródło
Szybki 4
Stosowanie
źródło
Jedynym rozwiązaniem, jakie masz teraz, jest przeanalizowanie kodu HTML, zbudowanie kilku węzłów z podanymi atrybutami point / font / etc, a następnie połączenie ich razem w NSAttributedString. To dużo pracy, ale jeśli zostanie wykonane poprawnie, może być ponownie wykorzystane w przyszłości.
źródło
Powyższe rozwiązanie jest poprawne.
Ale aplikacja ulegnie awarii, jeśli używasz jej na iOS 8.1, 2 lub 3.
Aby uniknąć awarii, możesz zrobić: uruchom to w kolejce. Aby zawsze był w głównym wątku.
źródło
Używanie NSHTMLTextDocumentType jest powolne i trudno jest kontrolować style. Proponuję wypróbować moją bibliotekę, która nazywa się Atributika. Posiada własny, bardzo szybki parser HTML. Możesz także mieć dowolne nazwy tagów i zdefiniować dla nich dowolny styl.
Przykład:
Możesz go znaleźć tutaj https://github.com/psharanda/Atributika
źródło
Swift 3 :
Spróbuj tego :
I do użycia:
źródło
Pomocne rozszerzenia
Zainspirowany tym wątku, podcastów i objc przykład Erica Sadun w iOS Gourmet Cookbook str.80, pisałem na przedłużenie
String
iNSAttributedString
przejść tam iz powrotem pomiędzy HTML zwykły łańcuchów i NSAttributedStrings i odwrotnie - na GitHub tutaj , które Znalazłem pomocne.Te podpisy są (znowu pełny kod w GIST linku powyżej):
źródło
z czcionką
alternatywnie możesz użyć wersji, z których pochodzi, i ustawić czcionkę na UILabel po ustawieniu atrybututributedString
źródło
Wbudowana konwersja zawsze ustawia kolor tekstu na UIColor.black, nawet jeśli przekazujesz słownik atrybutów z ustawieniem .forgroundColor na coś innego. Aby obsługiwać tryb DARK w systemie iOS 13, wypróbuj tę wersję rozszerzenia na NSAttributedString.
źródło