Анимированный UIImage в UITextView с TextKit

У меня есть UIImage, который содержит несколько кадров изображения и продолжительность, которая была нарезана вместе из анимированного GIF файла. Если я загружу изображение в UIWebView, он будет оживлять, как ожидалось, но вместо этого я хочу использовать UITextView. Очевидным выбором является использование TextKit с пользовательскими NSLayoutManger и многими пользовательскими атрибутами NSAttributedString для достижения различных эффектов рисования. У меня есть один UITextView, который я бы хотел предоставить NSAttributedString, который содержит NSTextAttachment для всех изображений, которые мне нужно отображать в строке. Он отлично работает, за исключением того, что когда я загружаю один из этих анимированных UIImages, они не оживляют свои фреймы. Любые мысли о том, как это сделать? Я придумал теоретический вариант:

  • Для каждого анимированного изображения добавьте настраиваемый атрибут
  • Когда менеджер компоновки отправляется рисовать фоны, повторите этот атрибут, чтобы найти позиции вложения.
  • Обратный вызов текстового представления для создания UIImageView с анимированным изображением, добавьте как подвью и вызовите startAnimating

Мне еще нужно попробовать, но это довольно хаки. Мне интересно, есть ли лучший вариант.

Вкратце: я хочу анимировать UIImage внутри UITextView через NSTextAttachment внутри a NSAttributedString без необходимости дополнительных объектов UIImageView. Вы можете игнорировать тот факт, что это было сделано ранее с помощью UIWebView. UIImage имеет свойства (images, duration) для настройки анимированных кадров, которые я сейчас настроил. Если я присвою его UIImageView, он будет анимировать, если я установил его как NSTextAttachment, без анимации.

Буду признателен за любые отзывы. Спасибо!

Ответы

Ответ 1

Я думаю, что это поведение связано с тем, что UITextView не отображает вложения с помощью UIImageView subviews. Когда я наблюдаю иерархию представлений с NSTextAttachment и NSTextAttachment, добавленными в UITextView, я не вижу никаких новых представлений (вы можете наблюдать иерархию представлений, используя View Debugging в Xcode, или говоря [[[UIApplication sharedApplication] keyWindow] recursiveDescription]). Предположительно, UITextView просто рисует вложения напрямую.

Тем не менее, одним из способов, с помощью которого я могу включить анимационное приложение, является создание анимированного UIImageView себя в качестве подзадачи UITextView, поместите его точно там, где NSLayoutManager помещает NSTextAttachment, и прокручивайте его всякий раз, когда прокручивается UITextView. Вы можете получить прямоугольник NSTextAttachment из NSLayoutManager, вызвав boundingRectForGlyphRange:inTextContainer: (возможно, в layoutManager:didCompleteLayoutForTextContainer:atEnd:).