Я пытаюсь воспроизвести этот размытый фон с общедоступного примера экрана Apple iOS 7:
Этот вопрос предлагает применить фильтр CI к содержимому ниже, но это совершенно другой подход. Очевидно, что iOS 7 не захватывает содержимое представлений ниже по многим причинам:
- Выполнение грубого тестирования, создание снимка экрана представленных ниже видов и применение фильтра CIGaussianBlur с достаточно большим радиусом, чтобы имитировать стиль размытия в iOS 7, занимает 1-2 секунды, даже на симуляторе.
- Размытое представление iOS 7 способно размыть динамические виды, например видео или анимацию, без заметных задержек.
Может кто-нибудь предположить, какие структуры они могли бы использовать для создания этого эффекта, и возможно ли создать аналогичный эффект с текущими общедоступными API?
Редактировать: (из комментария) Мы точно не знаем, как Apple это делает, но есть ли какие-то основные предположения, которые мы можем сделать? Мы можем предположить, что они используют оборудование, верно?
Является ли эффект самодостаточным в каждом представлении, так что эффект фактически не знает, что за ним стоит? Или, исходя из того, как размытие работает, следует учитывать содержание, стоящее за размытием?
Если содержание, лежащее в основе эффекта, имеет отношение, можем ли мы предположить, что Apple получает «поток» содержимого ниже и постоянно рендерит их с размытостью?
источник
Ответы:
Зачем воспроизводить эффект? Просто нарисуйте UIToolbar позади вашего представления.
источник
frame
илиtransform
этой панели инструментов / представления или что-то в этом роде, иначе произойдут плохие вещи. Он также настоятельно предложил подать отчеты об ошибках Radar по этому вопросу, чтобы создать внутреннее дело, чтобы мы могли получить настоящий публичный API для этого эффекта!UITabBar
самому себе.Apple выпустила код на WWDC как категорию на UIImage, которая включает в себя эту функциональность. Если у вас есть учетная запись разработчика, вы можете получить категорию UIImage (и остальную часть примера кода), перейдя по этой ссылке: https://developer.apple. com / wwdc / schedule / и просматривая раздел 226 и нажимая на детали. Я еще не играл с ним, но думаю, что эффект будет намного медленнее в iOS 6, есть некоторые усовершенствования в iOS 7, которые делают захват начального снимка экрана, который используется в качестве входных данных для размытия, намного быстрее.
Прямая ссылка: https://developer.apple.com/downloads/download.action?path=wwdc_2013/wwdc_2013_sample_code/ios_uiimageeffects.zip
источник
На самом деле я бы поспорил, что это будет довольно просто достичь. Это, вероятно, не будет работать или выглядеть точно так, как Apple, но может быть очень близко.
Прежде всего, вам нужно определить CGRect UIView, который вы будете представлять. Как только вы определите, что вам просто нужно получить изображение части пользовательского интерфейса, чтобы его можно было размыть. Что-то вроде этого...
Gaussian Blur - рекомендуется
Используя
UIImage+ImageEffects
категорию Apple, представленную здесь , вы получите размытие по Гауссу, которое очень похоже на размытие в iOS 7.Box Blur
Вы также можете использовать размытие окна, используя следующую
boxBlurImageWithBlur:
категорию UIImage. Это основано на алгоритме, который вы можете найти здесь .Теперь, когда вы вычисляете область экрана для размытия, переводите ее в категорию размытия и получаете обратно размытое изображение UIImage, теперь осталось только установить размытое изображение в качестве фона представления, которое вы будете представлять. Как я уже сказал, это не будет идеальным совпадением с тем, что делает Apple, но все равно должно выглядеть довольно круто.
Надеюсь, поможет.
источник
renderInContext
, используйте новыйdrawViewHierarchyInRect:
илиsnapshotView:
. В докладе WWDC 216 «Внедрение привлекательного пользовательского интерфейса на iOS7» утверждается, что повышение производительности в 5–15 раз.iOS8 ответила на эти вопросы.
- (instancetype)initWithEffect:(UIVisualEffect *)effect
или Свифт:
init(effect effect: UIVisualEffect)
источник
Я только что написал свой маленький подкласс UIView, который имеет возможность создавать естественное размытие iOS 7 для любого пользовательского представления. Он использует UIToolbar, но безопасным способом для изменения его рамки, границ, цвета и альфа-канала с анимацией в реальном времени.
Пожалуйста, дайте мне знать, если вы заметите какие-либо проблемы.
https://github.com/ivoleko/ILTranslucentView
источник
Ходят слухи, что инженеры Apple утверждают, что для обеспечения этой производительности они читают напрямую из буфера gpu, что поднимает проблемы безопасности, поэтому пока еще нет общедоступного API для этого.
источник
Это решение, которое вы можете увидеть в видео WWDC. Вы должны сделать Gaussian Blur, поэтому первое, что вы должны сделать, это добавить новый файл .m и .h с кодом, который я пишу здесь, затем вы должны сделать снимок экрана, использовать желаемый эффект и добавьте его к своему виду, затем к вашему UITable UIView или к тому, что когда-либо должно быть прозрачным, вы можете поиграть с applyBlurWithRadius, чтобы заархивировать желаемый эффект, этот вызов работает с любым UIImage.
В конце размытое изображение станет фоном, а остальные элементы управления должны быть прозрачными.
Для этого вам нужно добавить следующие библиотеки:
Acelerate.framework, UIKit.framework, CoreGraphics.framework
Я надеюсь тебе это понравится.
Удачного кодирования.
источник
Вы можете найти свое решение от Apple DEMO на этой странице: WWDC 2013 , найдите и загрузите пример кода UIImageEffects.
Затем с кодом @ Джереми Фокса. Я изменил это на
Надеюсь, что это поможет вам.
источник
Вот действительно простой способ сделать это: https://github.com/JagCesar/iOS-blur
Просто скопируйте слой UIToolbar, и все готово, AMBlurView сделает это за вас. Хорошо, это не так размыто, как центр управления, но достаточно размыто.
Помните, что iOS7 находится под NDA.источник
Каждый ответ здесь использует vImageBoxConvolve_ARGB8888 эта функция очень, очень медленная, это хорошо, если производительность не является требованием высокого приоритета, но если вы используете это для перехода между двумя контроллерами представления (например), такой подход означает время более 1 во-вторых, а может и больше, это очень плохо сказывается на работе вашего приложения.
Если вы предпочитаете оставить всю эту обработку изображений на GPU (и вы должны это сделать), вы можете получить гораздо лучший эффект, а также отличные времена, округляющие 50 мс (предположим, что у вас есть время в 1 секунду при первом подходе), так что давайте сделаем это ,
Сначала загрузите GPUImage Framework (BSD Licensed) здесь .
Затем добавьте следующие классы (.m и .h) из GPUImage (я не уверен, что это минимум, необходимый только для эффекта размытия)
GPUImageTwoPassTextureSamplingFilter
Ios / GPUImage-Prefix.pch
Затем создайте категорию на UIImage, которая добавит эффект размытия к существующему UIImage:
И наконец, добавьте следующие рамки в ваш проект:
AVFoundation CoreMedia CoreVideo OpenGLES
Да, повеселился с этим гораздо более быстрым подходом;)
источник
Вы можете попробовать использовать мой пользовательский вид, который имеет возможность размыть фон. Он делает это путем фальсификации, снимая фон и размывая его, как в коде Apple WWDC. Это очень просто в использовании.
Я также сделал некоторые улучшения, чтобы имитировать динамическое размытие без потери производительности. Фоном моего вида является scrollView, который прокручивается вместе с видом, таким образом обеспечивая эффект размытия для остальной части суперпредставления.
Смотрите пример и код на моем GitHub
источник
Базовый фон реализует желаемый эффект iOS 7.
https://github.com/justinmfischer/core-background
Отказ от ответственности: я являюсь автором этого проекта
источник