2015-04-29 1 views
16

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

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

У меня есть еще попробовать это, но это довольно Hacky. Мне интересно, есть ли лучший вариант.

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

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

+1

Удивительно то же самое сегодня утром. – yellottyellott

+0

Можете ли вы предоставить скриншот, как он выглядит в WebView, который вы пытаетесь реплицировать с помощью UIImage и UITextView. Это поможет лучше визуализировать его и помочь с ответами. – pteofil

+0

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

ответ

2

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

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

+0

Да, это «теоретический вариант», о котором я говорил в своем вопросе. Это довольно хаки, и я хотел бы избежать этого подхода, если это возможно, так как он будет хрупким и потребует тонны дополнительного управления этими надзорами 'UIImageView'. «UITextView», который я использую, содержится в 'UICollectionViewCell', поэтому ячейке придется управлять своими позициями и жизненным циклом. Когда я сначала исследовал, я сделал то, что вы сказали: я просмотрел подсмотры текстового представления в надежде, что он вложил некоторые виды изображений, которые я мог бы оживить, но нет субвью, все рендеринг выполняется в «CATiledLayer». – afrederick

+0

Если текстовое представление находится в представлении коллекции, вам нужно будет управлять позициями изображений и жизненными циклами изображений так же, как и для текстового вида. Вы можете создавать подпрограммы UIImageView при создании UITextView и размещать их в файле doCompleteLayout. Если текстовое представление находится в представлении коллекции, я предполагаю, что вы не используете функции прокрутки textview - если это так, вам не нужно будет прокручивать представление изображения. – roop

Смежные вопросы