Интерактивное размытие UIImage и UIView, как в центре внимания iOS 8

В iOS 8 появилось довольно эффектное интерактивное размытие. В частности, есть интерактивное размытие, когда вы тянете вниз для прожектора, но есть также анимация при открытии и закрытии Siri (хотя это не интерактивно). Я заметил это интерактивное размытие только в одном другом месте: в официальном приложении Твиттера при просмотре профиля (параллаксное изображение в заголовке масштабируется и размывается иногда).

Я попытался анимировать что-то базовое с помощью UISlider как с CoreImage, так и с GPUImage (на основе ответа на этот вопрос, а также UIImage+ImageEffects от Apple. , но ничто не кажется достаточно производительным, чтобы анимировать размытие в интерактивном режиме (т. е. размытие изображения до одного значения работает быстро один раз, но не с достаточно высокой частотой кадров для непрерывного размытия).

Как я могу реализовать эти методы таким образом, чтобы они были достаточно производительными для интерактивного размытия и устранения размытия UIImage (и в идеале моментального снимка UIView или CIContext)?


person brandonscript    schedule 16.11.2014    source источник
comment
Сделайте снимок экрана вашего вида, а затем размойте снимок экрана. stackoverflow.com/questions/18942037 /   -  person Nick Wilkerson    schedule 16.11.2014
comment
Ключевое слово @NickWilkerson здесь — интерактивно. Оба сообщения, на которые я ссылался, делают именно это, но они недостаточно производительны, если не работают в GCD dispatch_async, и тогда это не потокобезопасно.   -  person brandonscript    schedule 16.11.2014
comment
Как насчет предварительного расчета кадров (с разным уровнем размытия, если я правильно понял ваш вопрос) перед запуском анимации, чтобы они были доступны в памяти во время анимации?   -  person quentinadam    schedule 16.11.2014
comment
@goldmine интересная идея... чем анимировать, CAKeyFrameAnimations?   -  person brandonscript    schedule 16.11.2014
comment
да. Раньше я работал над чем-то подобным, чтобы создать светящуюся кнопку (светится синусоидально и повторяется). Я использовал CAKeyFrameAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@contents] и предоставил массив временных меток с [animation setKeyTimes:times] и массив UIImages с [анимацией setValues:values].   -  person quentinadam    schedule 16.11.2014
comment
Как обсуждалось здесь: stackoverflow.com/questions/18804668/ , вы можете обмануть это, размыв фон, а затем анимировав переход между размытым изображением и исходным четким изображением. Это дает вам интерактивную производительность без необходимости управлять различными радиусами размытия на каждом этапе.   -  person Brad Larson    schedule 17.11.2014
comment
@BradLarson, да, я тоже пробовал, и это просто не БАМ! Прекрасный   -  person brandonscript    schedule 17.11.2014
comment
нашел это на Reddit, возможно, это то, что вы ищете reddit.com/ r/iOSProgramming/comments/2jjuec/   -  person akaralar    schedule 08.05.2015
comment
@akaralar вау, это безумие - похоже, это действительно работает. Я должен дать ему шанс.   -  person brandonscript    schedule 08.05.2015


Ответы (1)


Нет простого и единственного способа сделать это, но это определенно выполнимо, если вы выполните следующие шаги и дополнительные способы:

  1. Самое главное: понизьте разрешение изображения. Базовое разрешение не очень важно для размытия по Гауссу. Если вы понизите разрешение только до половинного разрешения, объем данных уменьшится до четверти!

  2. Определите радиус размытия конечной цели.

  3. Получите архитектуру устройства с помощью функций C и используйте разные значения параметра дельта-насыщения для разных архитектур, в зависимости от вычислительной мощности, конечно.

  4. Поэкспериментируйте с созданием размытия с помощью предоставленной Apple библиотеки с шагом радиуса относительно значения шага параметра, с которым взаимодействует (например, свойство KVO to contentOffset). dispatch_async и не забудьте сделать обратный вызов с размытым изображением в основную очередь!

  5. Описанные выше методы почти наверняка подойдут для всех архитектур, начиная с arm7, но у вас могут возникнуть некоторые проблемы с arm7 — iPhone 4s).

  6. Если у вас все еще есть проблемы, как с упомянутой рукой7, удвойте изменение contentOffset, необходимое для следующего размытия со следующим радиусом. Затем вместо изменения свойства изображения в UIImageView лучше создайте новый UIImageView с новым размытым UIImage и затухайте в альфа-канале от 0 до 1 в течение периода, когда создается следующая размытая страница.

  7. Вы можете использовать ряд приемов, например, создавать все размытые изображения одно за другим для полного интерактивного масштаба, кэшировать их в коллекции и использовать в методе, описанном в пункте 6.

Есть также много других методов, если анимация не интерактивна, а привязана к определенному кадру.

person mbpro    schedule 26.03.2015