Анимированный 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:
).