2011-11-25 37 views
14

Chcę zastąpić ikony emoji własną grafiką (tylko w mojej aplikacji).Przesłanianie grafiki emoji

Z tego, co dotychczas przeczytałem, jednym z możliwych rozwiązań jest utworzenie niestandardowego rozszerzenia czcionki, które zastępuje pożądane znaki Unicode. Wolałbym zachować współdziałanie z CATextLayer.

Edytuj: Wygląda na to, że niestandardowe czcionki nie będą moim rozwiązaniem; czcionki muszą być zdefiniowane w skali szarości. Następna możliwość: Tworzenie niestandardowej wersji CALayer, dzielenie łańcucha na segmenty w oparciu o kod emoji i ręczne wprowadzanie ustawień typu + renderowanie grafiki (np. Z rdzeniem graficznym i tekstem podstawowym)

Edycja: także w celu zachowania płynnego przewijania w widoki tabel.

+0

Może to ci pomóc - http://stackoverflow.com/questions/1225514/making-an-emoji-enabeling-app – Sagar

Odpowiedz

2

Poświęciłem dużo czasu, próbując zrobić to samo. Najlepiej jest zastąpić wartości Unicode dla emoji w NSString np. \ uE100 itp. z łańcuchem zastępczym. Możesz zastąpić kodowanie emoji znacznikiem HTML i użyć albo UIWenViews albo DTCoreText, aby narysować obraz w linii. Zrobiłem to, że działa zbyt, ale to będzie trochę powolny

Oto mały rozrusznik (szczególnie jeśli chcesz wyświetlić tę etykietę w widokach tabeli.):

Zrób słownik z UIImages jako obiektów i ciągów zastępczych jak klucze:

 self.emoticonDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"happyEmoticon.png", @":)", 
         @"sadEmoticon.png",  @":(", 
         @"testImg.png",   @"\uE100", 
         nil]; 


__block NSString *text1 = [NSString stringWithFormat:@"<html><p>%@</p></html>",text]; 
    [self.emoticonDict enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) { 
     text1 = [text1 stringByReplacingOccurrencesOfString:key withString:[NSString stringWithFormat:@"<img height= 15 width= 15 src=\"%@\">",obj]]; 
    }]; 

można w tym punkcie obciążenia to HTML do UIWebView i będziesz miał co chcesz.

[myWebView loadData:_htmlData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];//do create the webview first 

Jeśli powolna prędkość UIWebView jest problemem, możesz przeczytać z wyprzedzeniem. W obu przypadkach spójrz na notatkę pod koniec tej odpowiedzi.

Aby utworzyć DTAttributedLabel, mamy następujące: Najpierw budujemy NSattributedString Używanie DTHTMLAttributedStringBuilder:

NSAttributedString *temp = [[[DTHTMLAttributedStringBuilder alloc] initWithHTML:text1 
                options:@{ 
            DTDefaultFontFamily: @"Helvetica", 
            DTDefaultFontSize:@15,}; 
            documentAttributes:nil] 
            generatedAttributedString]; 

Następnie można użyć instancji DTAttributedLabel wyświetlanie temp.

self.tempLabel.attributedString = temp;//create a DTAttributedLabel Instance called tempLabel before this, I had it as a property 

Moim celem było, aby wygenerować tekst etykiety jest bardzo szybki (Tabela wyświetleń) przy jednoczesnym wspieraniu niestandardowe emotikony. Etykiety DTAttributedLabels są szybkie (znacznie szybsze niż UIWebView). UWAGA: Utworzyłem także niestandardową czcionkę, w której zmapowałem wartości Unicode dla emotikonów do niestandardowego glifu. Ku mojemu zdziwieniu, wciąż wyświetlały się domyślne emoji. Chciałbym tutaj powiedzieć, że za każdym razem, gdy iOS (CoreText) napotyka postać, której wartość znajduje się w sekcji Emoji, rysuje ją domyślnie za pomocą czcionki AppleColorEmoji.Brak dokumentacji dotyczącej faktycznego rysowania czcionek Emotikon Apple Colour w systemie iOS sprawia, że ​​trudno jest to udowodnić, ale wydaje się, że jest to wiarygodne wytłumaczenie. Po zrzuceniu emotikonu z aplikacji palety znaków do pliku w pliku tekstowym, a następnie zaznacz go i spróbuj zmienić czcionkę, zobaczysz, że tak się nie dzieje. Podobnie, jeśli wpiszesz jakiś tekst, a następnie wybierzesz go i spróbujesz zmienić jego czcionkę na emoji Apple Colour, zobaczysz, że tak się nie dzieje. Kiedy dekompilowałem czcionkę Emoji Apple Colour, nie znalazłem odwzorowań ani znaków glifów dla znaków tekstowych (oprócz 0-9). W jakiś sposób, nawet jeśli ustawisz czcionkę etykiety jako emoji Apple Colour, czcionka dla tekstowej (nie emoji) części tekstu etykiety zostanie ustawiona na coś innego.

Prosimy o komentowanie i dzielenie się wiedzą, ponieważ ten region wokół czcionki Emoji Apple Color nadal pozostaje bardzo niejasny.

+0

Awesome. Minęło dużo czasu odkąd dotknąłem tego problemu i od miesięcy nie pracuję na iOS. Ale masz moje uprowadzenie! – lorean

0

Jednym z rozwiązań byłoby użycie delegata UITextField lub TextView i wysłuchanie danych wprowadzonych przez użytkownika. Gdy wpiszą znak emoji, wpisz tekst w wierszu i usuń ikonę emoji z danymi wejściowymi.

+0

Dzięki za sugestie. Niestety w moim przypadku muszę unikać używania obiektów UIKit, ponieważ cierpią one z powodu przerywanego przewijania. – lorean

+0

@lorean Jeśli problemy z wydajnością przewijają się po włączeniu kilku UIViews, prawdopodobnie robisz coś nierozsądnego, jak na przykład podkręcanie CALayera. Czy możesz rozwinąć? –

+0

Witaj Conrad. Przeprowadziłem rozległe testy przy użyciu UIViews w tableCells. Nigdy nie byłbym w stanie przekonać komórki tabeli do perfekcyjnego przewijania. Zawsze było pomijanie klatek i okazjonalnie niska ogólna liczba klatek na sekundę. Co mogę zrobić, to zwinąć hierarchię widoku w jeden drawRect :, lub bardziej niedawno tworząc kompozycję CALayers. Jeśli masz przykładowy kod skomplikowanego tableViewCell zbudowanego w całości z UIViews z doskonałym efektem przewijania, chciałbym go zobaczyć! – lorean

0

Jest kilka wzmianek o tym problemie na prywatnych serwerach Apple (do których masz dostęp, jeśli jesteś zarejestrowanym użytkownikiem programu dla iOS).

Wygląda na to, że potencjalnym rozwiązaniem byłoby jawne ustawienie czcionki dla tego, co próbujesz wyświetlić.

+0

Mam dostęp do forów, ale nie mogę znaleźć niczego. Nawet wyszukiwanie emotikonów zwraca zero wyników wyszukiwania. – lorean

+0

Niektóre linki mogą być przydatne, @Michael? – Emil

+0

Witaj @ Emil ... [tutaj jest jeden] (https://devforums.apple.com/message/531811#531811) (pierwsze kilka odpowiedzi w tym wątku mówi o ustawianiu czcionki); Zastanawiam się, czy flaga plist 'KeyboardEmojiEverywhere' działałaby w paczce pojedynczej aplikacji? Jeśli nie, zalecam złożenie wniosku o dodanie funkcji na stronie bugreporter.apple.com. –