实现模糊效果有两种方式:
第一种是直接对图片做处理,增加模糊效果,然后替换之前的图片;
- (void)setImageToBlur: (UIImage *)image
blurRadius: (CGFloat)blurRadius
{
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *sourceImage = [CIImage imageWithCGImage:image.CGImage];
// Apply clamp filter:
// this is needed because the CIGaussianBlur when applied makes
// a trasparent border around the image
NSString *clampFilterName = @"CIAffineClamp";
CIFilter *clamp = [CIFilter filterWithName:clampFilterName];
if (!clamp) {
return;
}
[clamp setValue:sourceImage
forKey:kCIInputImageKey];
CIImage *clampResult = [clamp valueForKey:kCIOutputImageKey];
// Apply Gaussian Blur filter
NSString *gaussianBlurFilterName = @"CIGaussianBlur";
CIFilter *gaussianBlur = [CIFilter filterWithName:gaussianBlurFilterName];
if (!gaussianBlur) {
return;
}
[gaussianBlur setValue:clampResult
forKey:kCIInputImageKey];
[gaussianBlur setValue:[NSNumber numberWithFloat:blurRadius]
forKey:@"inputRadius"];
CIImage *gaussianBlurResult = [gaussianBlur valueForKey:kCIOutputImageKey];
__weak UIImageView *selfWeak = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
CGImageRef cgImage = [context createCGImage:gaussianBlurResult
fromRect:[sourceImage extent]];
UIImage *blurredImage = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
dispatch_async(dispatch_get_main_queue(), ^{
selfWeak.image = blurredImage;
});
});
}
第二种是创建一个UIVisualEffectView对象,然后把它放在需要模糊的内容上面,实现模糊效果;
imageview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 20,200, 200)];
imageview.contentMode = UIViewContentModeScaleAspectFit;
imageview.userInteractionEnabled = YES;
[self.view addSubview:imageview];
UIBlurEffect *blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
UIVisualEffectView *effectview = [[UIVisualEffectView alloc] initWithEffect:blur];
effectview.frame = CGRectMake(0, 0, imageview.frame.size.width/2, 300);
[imageview addSubview:effectview];
// UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
//
// btn.frame = CGRectMake(10, 50, 100, 40);
//
// [btn setTitle:@"btn" forState:UIControlStateNormal];
//
// [effectview.contentView addSubview:btn];
相对实现来说,第二种简单一点,但是还是要看具体需求来选择使用哪种方式。