2013-07-17 4 views
35

Я пытаюсь создать контроллер, который будет похож на Control Center в iOS7. От WWDC сессии # 226 Я узнал, как получить размытое изображение с различными эффектамиiOS 7 динамический эффект размытия, как в Центре управления

UIGraphicsBeginImageContextWithOptions(image.size, NULL, 0); 

[view drawViewHierarchyInRect:rect]; 

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

lightImage = [newImage applyLightEffect]; 

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

Но если вы откроете центр управления над некоторым динамическим контентом, вы заметите, что размытый фон центра управления меняется, а также содержимое.

Кто-нибудь знает, как воспроизвести это поведение?

Единственный способ, с помощью которого я вижу это захват контента и создание эффекта размытия с некоторым интервалом (например, полсекунды). Но он выглядит излишне.

ответ

43

Вот готовые решения, которые я нашел:

1. Самое неожиданное: Используйте UIToolbar

- (id) initWithFrame:(CGRect)frame 
{ 
    if ((self = [super initWithFrame:frame])) 
    { 
     [self setup]; 
    } 
    return self; 
} 

- (id) initWithCoder:(NSCoder *)coder 
{ 
    if ((self = [super initWithCoder:coder])) 
    { 
     [self setup]; 
    } 
    return self; 
} 

- (void) setup 
{ 
    if (iOS7OrLater) 
    { 
     self.opaque = NO; 
     self.backgroundColor = [UIColor clearColor]; 

     UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:self.bounds]; 
     toolbar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
     toolbar.barTintColor = self.tintColor; 
     [self insertSubview:toolbar atIndex:0]; 
    } 
} 

UIToolbar могут быть использованы для этого нужно, bacuse имеет свою единственную Build- в размытом механизме, и этот механизм динамичен, что хорошо. Но плохо то, что в какой-то причине он игнорирует цвета и делает фон выглядит непоправимо ...

Toolbar effect

Update:

Чтобы избежать цветов ломки, не используйте barTintColor. Вы также можете изменить стиль панели инструментов, если хотите размытие в темном стиле (используйте UIBarStyleBlack).

2. FXBlurView.

В отличие от панели инструментов это более позитивно, но динамический механизм редок еще и на самом деле его можно использовать только для статического фона. (динамический = НЕТ).

FBBlurView effect

+3

Когда вы устанавливаете tintColor, размытие размывается. Просто используйте панель инструментов по умолчанию или ту, которая имеет темный barStyle. И, пожалуйста, не используйте FXBlurView в динамическом режиме, потому что он будет разряжать батареи пользователей быстрее, чем может размыть. –

+0

Спасибо, @FilipRadelic! Как вы сказали, я удалил tintColor и установил UIBarStyleBlack для панели инструментов. Он динамичен и теперь выглядит почти идеальным :). Я уточню свой ответ. –

+0

Любые идеи, если такой тип реализации приведет к отказу от яблока? Или, наоборот, отпразднуют ли они творческий подход? – YoCoh

0

Использование панели навигации, чтобы обеспечить размытость не будет работать на старых устройствах под управлением IOS 7. Как они работают более легкую версию прошивкой 7 практически не т

12

В iOS8 мы можем реализовать эффект размытия на взгляды, используя UIVisualEffect класс.

1

Вы можете использовать UIVisualEffect из раскадровки.

Перетащите визуальный эффект с помощью размытия на раскадровку. Желаемый эффект может быть достигнут путем установки альфа BACKGROUND COLOR. Подразделы должны быть добавлены в View of Visual Effect View, и на них не влияет размытие фона.

Эффект вибрации должен быть выбран в виде вариантов выше.

См изображения:

7

Вы можете использовать ниже код, чтобы применить эффект размытия на виду.

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

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

visualEffectView.frame = MYview.bounds; 
[MYview addSubview:visualEffectView]; 
+0

Это действительно работает! Отличное решение :-) –