2015-04-29 11 views
16

Mam UIImage, który zawiera wiele ramek obrazu i czas, który został podzielony na plasterki z animowanego pliku GIF. Jeśli załaduję obraz w postaci UIWebView, będzie on animowany zgodnie z oczekiwaniami, ale zamiast tego chcę użyć wartości UITextView. Oczywistym wyborem jest użycie TextKit z niestandardowym NSLayoutManger i wieloma niestandardowymi atrybutami NSAttributedString, aby uzyskać różne efekty rysowania. Mam pojedyncze UITextView, które chciałbym dać NSAttributedString s, który zawiera NSTextAttachment s dla wszystkich obrazów, które muszę wyświetlić w linii. Działa to dobrze, z wyjątkiem sytuacji, gdy ładuję jeden z tych animowanych UIImages, nie animują one swoich ramek. Wszelkie przemyślenia na temat tego, jak to osiągnąć? Mam wymyślić opcji teoretycznej:Animowane UIImage w UITextView z TextKit

  1. Dla każdego animowanym obrazem dodać niestandardowy zdefiniowany atrybut
  2. Kiedy menedżer układ przechodzi do rysowania tła, iteracyjne tego atrybutu, aby zlokalizować pozycje załącznika.
  3. oddzwaniania do widoku tekstu do tworzenia UIImageView s z animowanym obrazem, dodawać jako podrzędny, a nazywają startAnimating

muszę jeszcze spróbować, ale jest to dość hacky. Zastanawiam się, czy jest lepsza opcja.

Podsumowując: chcę, aby animować UIImage Wewnątrz UITextView poprzez NSTextAttachment Wewnątrz NSAttributedString bez konieczności dodatkowych UIImageView obiektów. Możesz zignorować fakt, że zostało to wcześniej zrobione z UIWebView. UIImage ma właściwości (images, duration) do konfigurowania animowanych ramek, które mam obecnie skonfigurowane. Jeśli przypiszę to do UIImageView, animuje, jeśli ustawię go jako NSTextAttachment, bez animacji.

Byłbym wdzięczny za wszelkie opinie. Dzięki!

+1

Zastanawiając się dokładnie to samo dziś rano. – yellottyellott

+0

Czy możesz podać zrzut ekranu, jak wygląda w WebView, który próbujesz replikować za pomocą UIImage i UITextView. Pomoże to wizualizować to lepiej i pomóc w odpowiedziach. – pteofil

+0

@pteofil Nie mogę zrzutu ekranu, ponieważ nie będziesz wiedział, że obraz jest animowany, po prostu wyglądałby jak statyczny obraz. Aby wyjaśnić: Chcę animować UIImage wewnątrz UITextView przez NSTextAttachment wewnątrz NSAttributedString * bez * konieczności dodatkowych obiektów UIImageView. Możesz zignorować fakt, że zostało to wcześniej zrobione za pomocą interfejsu UIWebView. UIImage ma właściwości (obrazy, czas trwania) do konfigurowania animowanych ramek, które mam obecnie skonfigurowane. Jeśli przypiszesz go do UIImageView, animuje się, jeśli ustawię go jako NSTextAttachment, bez animacji. – afrederick

Odpowiedz

2

Myślę, że to zachowanie jest spowodowane tym, że UITextView nie wyświetla załączników przy użyciu subviews o numerze UIImageView. Gdy obserwuję hierarchię widoku zi bez dodanych NSTextAttachment s, nie widzę żadnych nowych widoków (można obserwować hierarchię widoków za pomocą widoku Debugging w Xcode lub mówiąc: [[[UIApplication sharedApplication] keyWindow] recursiveDescription]). Przypuszczalnie model UITextView po prostu rysuje jego załączniki.

Powiedział, że jeden sposób mogę myśleć o włączenie animatable przywiązanie jest stworzenie animowanego UIImageView siebie jako podrzędny w UITextView umieścić go dokładnie gdzie NSLayoutManager Umieszcza NSTextAttachment i przewinąć go, gdy przewija UITextView. Możesz pobrać prostokąt NSTextAttachment z NSLayoutManager, dzwoniąc pod numer boundingRectForGlyphRange:inTextContainer: (prawdopodobnie w layoutManager:didCompleteLayoutForTextContainer:atEnd:).

+0

Tak, to jest "opcja teoretyczna", o której mówiłem w moim pytaniu. Jest to dość hacky i chciałbym, jeśli to możliwe, uniknąć tego podejścia, ponieważ będzie ono kruche i wymagałoby mnóstwa dodatkowego zarządzania tymi subskrybcjami "UIImageView". "UITextView", którego używam, jest zawarty w "UICollectionViewCell", więc komórka będzie musiała zarządzać ich pozycjami i cyklem życia. Kiedy początkowo szukałem, zrobiłem to, co powiedziałeś: Sprawdziłem pod-wyglądy widoku tekstowego w nadziei, że zagnieździło się kilka widoków obrazów, które mogłem animować, ale nie ma żadnych subskrybentów, wszystkie renderowanie odbywa się w ramach "CATiledLayer". – afrederick

+0

Jeśli widok tekstowy znajduje się w widoku kolekcji, musisz zarządzać pozycjami widoków i cyklami życia w taki sam sposób, jak w widoku tekstowym. Możesz utworzyć widok podrzędny UIImageView za każdym razem, gdy tworzysz UITextView, i umieszczasz je w didCompleteLayout. Jeśli widok tekstowy znajduje się w widoku kolekcji, domyślam się, że nie używasz funkcji przewijania tekstu - jeśli tak jest, nie musisz zawracać sobie głowy przewijaniem widoku obrazu. – roop