Эффект матового стекла (iOS 7 Blur)

Я пытаюсь применить эффект матового стекла в UIImageView.

Я пытался реализовать то, что нашел в этом вопросе, но результат не был приемлемым. Я хотел что-то вроде этого:

Frosted Glass Effect

Кроме того, мы видим, что iOS 7 использует этот вид эффекта во многих местах. Как мы можем воспроизвести это?

Ответ 1

Хороший учебник по CoreImage здесь, показывающий, как применять фильтры и многое другое:

http://www.raywenderlich.com/5689/beginning-core-image-in-ios-5

ОБНОВЛЕНИЕ 1

Итак, после небольшого исследования я обнаружил, что Core Image для iOS по-прежнему неполна по сравнению с версией библиотеки OS X. Поэтому я много искал в googled, и я нахожу два решения, один из них более простой, а другой гораздо более широкий и сложный библиотеки.

Так, например, в нескольких строках я могу получить результат, который я хочу (где originalImage - это UIImage для применения эффекта):

GPUImageGaussianBlurFilter *blurFilter = [[GPUImageGaussianBlurFilter alloc] init];
blurFilter.blurSize = 2;
UIImage *blurImage = [blurFilter imageByFilteringImage:resizedImage];

ОБНОВЛЕНИЕ 2

После того, как Apple анонсировала iOS 7, некоторые разработчики обнаружили, что обходной путь сделал то же самое, что Apple сделала в приложениях по умолчанию для iOS, поскольку Apple не предоставляла API для этого. Простейшее и лучшее решение, на мой взгляд, является этим. Почему я думаю, что это лучше? Потому что, даже если какой-то вид за ним движется, размытие по-прежнему отлично работает с обновленным эффектом, поскольку мы ожидаем, что он будет работать. Однако имейте в виду, что это зависит от SDK iOS 7 для работы, и это может быть опасным, если Apple изменит UIToolbar.

ОБНОВЛЕНИЕ 3

Apple упомянула на WWDC 2013 (Session 226 - Реализация взаимодействия с пользовательским интерфейсом на iOS), они предоставили бы класс категорий в UIImage, называемый UIImage + ImageEffects (я искал его, и найден здесь, но он доступен в Портал разработчика - поиск UIImageEffects в окне поиска). С помощью этой категории вы можете применить размытие в статическом UIImage, используя несколько методов (светлые, темные, с определенным цветом и т.д.). Кроме того, вчера я увидел этот компонент и нашел его довольно интересным, так как вы можете применить эффект (на основе вышеупомянутой категории) в кадре.

ОБНОВЛЕНИЕ 4

Наконец, на iOS 8 Apple выпустила новые классы, которые легко могут сделать live blur. С помощью UIVisualEffect и UIVisualEffectView вы можете быстро добавить живое размытие в свои приложения. Вот хороший учебник от Райана Нистрома о том, как использовать эти классы (и в размытии в целом):

Ответ 2

Решение для iOS 7 и 8 без использования CoreImage или CoreGraphics:

- (void)addBlurToView:(UIView *)view {
    UIView *blurView = nil; 

    if([UIBlurEffect class]) { // iOS 8
        UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight];
        blurView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
        blurView.frame = view.frame;

    } else { // workaround for iOS 7
        blurView = [[UIToolbar alloc] initWithFrame:view.bounds];
    }

    [blurView setTranslatesAutoresizingMaskIntoConstraints:NO];

    [view addSubview:blurView];
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[blurView]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(blurView)]];
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[blurView]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(blurView)]];
}

(предполагая, что вы не настроите таргетинг на версии старше, чем iOS 7, и если да, вам придется протестировать версию iOS в блоке else)

Это решение применяется ко всем представлениям, а не только к изображениям.

Ответ 3

Использование UIImageEffects

Если вам нужно больше контроля при применении размытия, вы можете использовать Apple UIImageEffects (доступный через их образец кода).

Вы можете скопировать код для UIImageEffects из библиотеки разработчиков Apple: Размытие и тонирование изображения

А вот как его использовать:

#import "UIImageEffects.h"
...

self.yourImageView.image = [UIImageEffects imageByApplyingLightEffectToImage:[UIImage imageNamed:@"yourImage.png"]];

Ответ 4

Посмотрите Руководство по программированию основных изображений. Кажется, что стилизовать фильтр, а фильтр размытия может подойти твои нужды. Я никогда не работал с Core Image раньше, но я думаю, что могут быть хорошие сессии WWDC, которые их привлекают. В документации есть базовая часть примера кода.