Как применить размытие к UIView?
Сейчас я создаю приложение для iPhone, которое требует размытия всего UIView. Как мне этого добиться? Я видел эту структуру, но я не думаю, что это работает с UIView. Есть ли альтернативный способ размывания UIView?
ОБНОВЛЕНИЕ: проверьте мой обновленный ответ ниже, добавив больше актуальности с появлением iOS 7 и iOS 8.
5 ответов
С момента выхода iOS 7 этот вопрос получил много откликов, и я подумал, что мне следует продолжить то, что я в итоге сделал.
Я лично размыл картинку в то время в фотошопе, но есть много хороших сторонних библиотек, которые делают динамическое и статическое размытие, вот пара:
- Эта гениальная библиотека занимает слой от
UITabBar
и применяется к любому представлению, чтобы получить родное размытие iOS 7: https://github.com/JagCesar/iOS-blur/ - Эта библиотека представляет собой библиотеку размытия в реальном времени, которая в реальном времени размывает любое изображение под ней: https://github.com/alexdrone/ios-realtimeblur (как указано в qegal)
- Еще один, который делает то же самое размытие в реальном времени: https://github.com/nicklockwood/FXBlurView
- Эта библиотека - та, которую я лично использую, и она великолепна, позволяя вам установить цвет оттенка среди других настроек: https://github.com/ivoleko/ILTranslucentView
Я хотел опубликовать это, потому что вам больше не нужно делать скриншоты отдельных кадров или экрана.
iOS 8: с выходом iOS 8, Apple включила встроенный размытый UIView
, UIVisualEffectView
( https://developer.apple.com/documentation/uikit/uivisualeffectview)
Это должно работать. Я прокомментировал код, чтобы помочь вам понять, что происходит:
//To take advantage of CIFilters, you have to import the Core Image framework
#import <CoreImage/CoreImage.h>
//Get a UIImage from the UIView
UIGraphicsBeginImageContext(myView.bounds.size);
[myView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//Blur the UIImage with a CIFilter
CIImage *imageToBlur = [CIImage imageWithCGImage:viewImage.CGImage];
CIFilter *gaussianBlurFilter = [CIFilter filterWithName: @"CIGaussianBlur"];
[gaussianBlurFilter setValue:imageToBlur forKey: @"inputImage"];
[gaussianBlurFilter setValue:[NSNumber numberWithFloat: 10] forKey: @"inputRadius"];
CIImage *resultImage = [gaussianBlurFilter valueForKey: @"outputImage"];
UIImage *endImage = [[UIImage alloc] initWithCIImage:resultImage];
//Place the UIImage in a UIImageView
UIImageView *newView = [[UIImageView alloc] initWithFrame:self.view.bounds];
newView.image = endImage;
[self.view addSubview:newView];
Если у вас есть какие-либо вопросы по поводу кода, просто оставьте его в комментариях.
Примечание. CIGaussianBlur отсутствует в iOS начиная с версии 5.1, поэтому вы должны найти другой способ размывания изображения для устройств 5.x+ (спасибо @BradLarson за этот совет). Принятый ответ на этот вопрос выглядит многообещающе в качестве замены, как и эта библиотека.
В iOS 8 вы можете использовать UIVisualEffectView
чтобы получить размытые виды. Смотрите: https://developer.apple.com/documentation/uikit/uivisualeffectview
Просто решается с помощью этого кода.
UIToolbar *toolBar = [[UIToolbar alloc]initWithFrame:yourView.bounds];
toolBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 7.0) {
toolBar.barTintColor = nil;
toolBar.translucent = YES;
toolBar.barStyle = UIBarStyleBlack;
}
else
[toolBar setTintColor:[UIColor colorWithRed:5 green:31 blue:75 alpha:1]];
[yourView insertSubview:toolBar atIndex:0];
Самый простой способ размывания вида - добавить UIToolbar, просто измените альфа-значение, чтобы изменить размытие.
self.toolbar = [[UIToolbar alloc]initForAutoLayout];
[self.view addSubview:self.toolbar];
[self.toolbar autoPinEdgeToSuperviewEdge:ALEdgeLeft withInset:0];
[self.toolbar autoPinEdgeToSuperviewEdge:ALEdgeRight withInset:0];
[self.toolbar autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:NAVBAR_HEIGHT];
[self.toolbar autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:0];
self.toolbar.alpha = 0.5;