Як використовувати UIVisualEffectView для розмиття зображення?


208

Чи може хтось навести невеликий приклад застосування розмиття до зображення? Я вже деякий час намагаюся розібратися з кодом :( досі новий у obj c!

Програма UIVisualEffectViewзабезпечує просту абстракцію над складними візуальними ефектами. Залежно від бажаного ефекту, результати можуть впливати на вміст, шаруватий за поданням, або на вміст, доданий до contentView перегляду.

Застосуйте а UIVisualEffectViewдо існуючого представлення, щоб застосувати ефект розмиття чи яскравості до вихідного подання. Після того, як ви додасте UIVisualEffectView до ієрархії перегляду, додайте будь-які підгляди до contentView UIVisualEffectView. Не додайте підпогляди безпосередньо до UIVisualEffectViewсебе.

https://developer.apple.com/documentation/uikit/uivisualeffectview#//apple_ref/occ/instp/UIVisualEffectView/contentView


1
Будьте обережні, щоб додати перегляди до UIVisualEffectView's contentView github.com/onmyway133/blog/isissue/124
onmyway133

Крім того, якщо ви додаєте його до підпогляду та встановлюєте його кадр, не забудьте оновити кадр у viewDidLayoutSubviews, щоб переконатися, що обертання працює.
Стів Мозер

Відповіді:


415

Просто поставте цей розмитий погляд на imageView. Ось приклад в Objective-C:

UIVisualEffect *blurEffect;
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

UIVisualEffectView *visualEffectView;
visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];

visualEffectView.frame = imageView.bounds;
[imageView addSubview:visualEffectView];

та Свіфт:

var visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light))    

visualEffectView.frame = imageView.bounds

imageView.addSubview(visualEffectView)

3
Дуже дякую! Я забув про налаштування кадру :( У Google ще нічого немає для візуального, тому це повинен бути перший пошуковий термін :)
cNoob

1
Сподіваємось, API не зміниться! Ось одна з причин обговорення ще не випущених API Apple може бути хитрою. Наприклад, деякі API UIKit Dynamics незначно змінюються між бета-версією та випуском. Нічого головного, але вони б порушили будь-який зразок коду, написаного проти оригінальних API.
Zev Eisenberg

5
Чи є в будь-якому разі анімація розмиття в / в?
Рубен Мартинес-молодший

3
@BS Ви можете анімувати альфа перегляду візуальних ефектів. Бум.
Maciej Trybiło

2
UIBlurEffect є приголомшливим, але зауважте, що він не працює на старих пристроях, таких як iPad2 - я витратив години на те, щоб зрозуміти, чому він лише наносить напівпрозорий шар на мій екран і не розмивається - це все тому, що я тестував на старішому пристрої
Кіт

135

Ось як використовувати UIVibrancyEffect та UIBlurEffect з UIVisualEffectView

Завдання-C:

// Blur effect
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
[blurEffectView setFrame:self.view.bounds];
[self.view addSubview:blurEffectView];

// Vibrancy effect
UIVibrancyEffect *vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect];
UIVisualEffectView *vibrancyEffectView = [[UIVisualEffectView alloc] initWithEffect:vibrancyEffect];
[vibrancyEffectView setFrame:self.view.bounds];

// Label for vibrant text
UILabel *vibrantLabel = [[UILabel alloc] init];
[vibrantLabel setText:@"Vibrant"];
[vibrantLabel setFont:[UIFont systemFontOfSize:72.0f]];
[vibrantLabel sizeToFit];
[vibrantLabel setCenter: self.view.center];

// Add label to the vibrancy view
[[vibrancyEffectView contentView] addSubview:vibrantLabel];

// Add the vibrancy view to the blur view
[[blurEffectView contentView] addSubview:vibrancyEffectView];

Швидкий 4:

    // Blur Effect
    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = view.bounds
    view.addSubview(blurEffectView)

    // Vibrancy Effect
    let vibrancyEffect = UIVibrancyEffect(blurEffect: blurEffect)
    let vibrancyEffectView = UIVisualEffectView(effect: vibrancyEffect)
    vibrancyEffectView.frame = view.bounds

    // Label for vibrant text
    let vibrantLabel = UILabel()
    vibrantLabel.text = "Vibrant"
    vibrantLabel.font = UIFont.systemFont(ofSize: 72.0)
    vibrantLabel.sizeToFit()
    vibrantLabel.center = view.center

    // Add label to the vibrancy view
    vibrancyEffectView.contentView.addSubview(vibrantLabel)

    // Add the vibrancy view to the blur view
    blurEffectView.contentView.addSubview(vibrancyEffectView)

1
Обхід працює навіть без підкласифікації, просто визначтеextension UILabel { override func tintColorDidChange() { textColor = tintColor; super.tintColorDidChange() } }
Палімондо,

1
Apple, схоже, виправила помилку. Підрозділ підкласу / розширення більше не потрібен в iOS 8 бета-версія 2.
Бенджамін Майо,

2
Дякую. Я перевірив і підтвердив виправлення помилок і відредагував відповідь.
Метт Рундл

1
Я намагаюся додати це до моєї точки зору, але кожен раз, коли я представляю подання, воно розмивається знову і знову, поки я не отримаю білий фон ... Я видаляю подання видаленням зFromSuperView після того, як я відхилю його, але я отримую той же результат .. .. якісь ідеї?
Джордж Асда

@GeorgeAsda як щодо замість того removeFromSuperView, щоб дзвонити , ви робите [self.visualEffectView setHidden:NO];? Виділення та додавання до перегляду - дорога операція, ніж приховування чи показ.
Yoon Lee

46

Ви також можете використовувати конструктор інтерфейсів, щоб легко створювати ці ефекти для простих ситуацій. Оскільки z-значення представлень залежатимуть від порядку, який вони перераховані у «Нариси документа», ви можете перетягнути UIVisualEffectViewконтур документа перед тим, як ви хочете розмити подання. Це автоматично створює вкладене UIView, що є contentViewвластивістю даної UIVisualEffectView. Вкладіть речі в межах цього виду, які ви хочете відобразити поверх розмиття.

XCode6 beta5

Ви також можете легко скористатися яскравістю UIVisualEffect, яка автоматично створить ще одне вкладене UIVisualEffectViewв контуру документа з увімкненою за замовчуванням яскравістю. Потім ви можете додати мітку або перегляд тексту до вкладеного UIView(знову ж, contentViewвластивості UIVisualEffectView), щоб досягти такого ж ефекту, що і елемент "> слайд для розблокування".

введіть тут опис зображення


Чи можете ви підтвердити, що те, що показує, насправді розмито? Моє зображення (те, що ви назвали "BackgroundPhoto" у своїй ієрархії) просто затьмарене під стилем "Розмиття": "Темний напівпрозорий". (Випуск версії Xcode 6.01 та використання iOS Simulator)
tobinjim

Що ви маєте на увазі "щойно затьмарене"? Ти не вважаєш, що вона розмита?
ой

Гаразд, я загляну через кілька годин.
ой

Дякую! У вас є ієрархія перегляду на вашому BackgroundPhoto, яка згорнута на скріншотах ... Я просто використав UIImageView і призначив йому фотографію (собака світлого кольору на зеленому тлі - чітке визначення між білими ногами та зеленою травою - це настільки ж різкі, коли охоплені зором візуального ефекту, як і коли ні).
tobinjim

1
Я бачив, що змінюючи тип розмиття на Темний, ярлик набуває білого кольору ...
Даніель

8

Я вважаю за краще створювати візуальні ефекти за допомогою Storyboard - не використовується код для створення або підтримки елементів інтерфейсу користувача. Це також дає мені повну підтримку пейзажу. Я зробив невеличку демонстрацію використання UIVisualEffects з Blur, а також Vibrancy.

Демо на Github


8

Якщо хтось хотів би відповісти у Swift:

var blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) // Change .Dark into .Light if you'd like.

var blurView = UIVisualEffectView(effect: blurEffect)

blurView.frame = theImage.bounds // 'theImage' is an image. I think you can apply this to the view too!

Оновлення:

На сьогоднішній день він доступний під IB, тому для цього вам нічого не потрібно кодувати :)


2
-(void) addBlurEffectOverImageView:(UIImageView *) _imageView
{
    UIVisualEffect *blurEffect;
    blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];

    UIVisualEffectView *visualEffectView;
    visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];

    visualEffectView.frame = _imageView.bounds;
    [_imageView addSubview:visualEffectView];
}

Додайте текст з відповіддю про те, як ваша відповідь допоможе ОП у вирішенні опублікованого випуску
ρяσѕρєя K

0

Це використовується для розмивання фонів, будь то світлих або темних, щоб текст міг легше накладатись. Ви можете додатково ввімкнути яскравість, що спричиняє виведення тексту яскравим, контрастним кольором поряд із розмиттям.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.