iOS毛玻璃效果的实现方法
2023-09-11 14:17:57 时间
ios开发中常常用到的毛玻璃效果实现方法
iOS8以后使用系统里的UIBlurEffect可以实现,UIBlurEffect继承自UIVisualEffect
UIBlurEffectStyle有三个值,UIBlurEffectStyleLight , UIBlurEffectStyleExtraLight , UIBlurEffectStyleDark,可以控制毛玻璃的效果.
UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect];
//必须给effcetView的frame赋值,因为UIVisualEffectView是一个加到UIIamgeView上的子视图.
effectView.frame = _imageView.bounds;
[self.imageView addSubview:effectView];
UIVibrancyEffect也继承自UIVisualEffect类,可以用来设置一些特殊的效果.代码如下
UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect];
effectView.frame = _imageView.bounds;
UIVibrancyEffect *viBrancyeffect = [UIVibrancyEffect effectForBlurEffect:effect];
UIVisualEffectView *vibrancyEffectView = [[UIVisualEffectView alloc] initWithEffect:viBrancyeffect];
vibrancyEffectView.frame = CGRectMake(100, 0, 200, 200);
UILabel *lbl = [[UILabel alloc] init];
lbl.text = @"测试Label";
lbl.font = [UIFont systemFontOfSize:25];
lbl.frame = CGRectMake(0, 0, 200, 200);
[vibrancyEffectView.contentView addSubview:lbl];
[effectView.contentView addSubview:vibrancyEffectView];
[self.imageView addSubview:effectView];
但是这种毛玻璃效果不能很好的控制模糊效果,可以alpha属性控制并不完美.
效果如下:
![](https://img2018.cnblogs.com/blog/556239/201908/556239-20190813162135234-1651817111.jpg)
使用系统CoreImage中的滤镜产生毛玻璃效果
原理是给图片添加滤镜,这种方式相比上面更为可控,下面介绍一下系统滤镜中支持的毛玻璃效果
先简要介绍一下系统滤镜CIFilter的使用
CIfilter中有一个专门用于毛玻璃效果的Category : kCICategoryBlur
使用下面的代码可以打印出这个分类下的滤镜
NSArray *filters = [CIFilter filterNamesInCategory:kCICategoryBlur];
可以得到结果
** CIBoxBlur,**
** CIDiscBlur,**
** CIGaussianBlur,**
** CIMaskedVariableBlur,**
** CIMedianFilter,**
** CIMotionBlur,**
** CINoiseReduction,**
** CIZoomBlur**
我们使用最常见的高斯模糊 (Gaussian Blur) 来进行举例
NSArray *inputKeys = filter.inputKeys;
可以得到这个滤镜支持两个输入属性,分别是inputImage,inputRadius
其中inputImage指你需要添加滤镜效果的图片,inputRadius指进行高斯模糊的程度
设置属性的方式有两种
一种是直接通过NSDictionary赋值
CIImage *testCIImage = [CIImage imageWithCGImage:[UIImage imageNamed:@"testImg.jpg"].CGImage];
NSDictionary *filterAttDict = @{@"inputImage" : testCIImage
,@"inputRadius" : [NSNumber numberWithDouble:5.0f]};
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur" withInputParameters:filterAttDict];
CIImage *outPutCIImage = [filter outputImage];
CIContext *ciContext = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [ciContext createCGImage:outPutCIImage fromRect:outPutCIImage.extent];
UIImage *resImage = [UIImage imageWithCGImage:cgImage];
另一种是通过kvc方法赋值
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
CIImage *testCIImage = [CIImage imageWithCGImage:[UIImage imageNamed:@"testImg.jpg"].CGImage];
[filter setValue:testCIImage forKeyPath:kCIInputImageKey];
[filter setValue:@50 forKeyPath:kCIInputRadiusKey];
CIImage *outPutCIImage = [filter outputImage];
CIContext *ciContext = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [ciContext createCGImage:outPutCIImage fromRect:outPutCIImage.extent];
UIImage *resImage = [UIImage imageWithCGImage:cgImage];
发现一个写的比较详细的博客,可以参考 http://www.jianshu.com/p/d115836ed3fa
相关文章
- iOS使用CoreLocation实现指南针
- iOS开发核心语言Objective C —— 面向对象思维、setter和getter方法及点语法
- 【iOS开发-59】LOL案例:单组tabView、alertView样式、实现监听,以及用reloadData数据刷新
- 【读书笔记】iOS-GCD-系统提供的dispatch方法
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
- 笔记 《Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法 》
- IOS开发中一些受用的编码和调试方法积累
- 浅谈 Unity、iOS、Android 闭包的使用方法
- iOS 11开发教程(十九)iOS11应用视图美化按钮之设置按钮的外观
- 《iOS 9 开发指南》——第1章,第1.1节IOS开发入门
- 《iOS应用开发指南——使用HTML5、CSS3和JavaScript》——1.6 小结
- iOS ViewController跳转界面的几种方法简单总结
- iOS上文本绘制的几种方法
- iOS中AutoLayer自动布局流程及相关方法
- IOS中对图片进行重绘处理的方法总结
- iOS 图片压缩方法的示例代码
- ios GUI系统综述:iOS的图形绘制、动画与runloop
- iOS动画的逻辑结构:动画的定义--动画是采用连续播放静止图像的方法产生物体运动的效果。
- 深入剖析 iOS 性能优化
- iOS UIWebView 访问https绕过证书验证的方法
- iOS 几种加密方法
- 在 iOS 中实现方法链调用
- 给iOS 模拟器“安装”app文件
- iOS中AutoLayer自动布局流程及相关方法
- 检测iOS的APP性能的一些方法
- 通过Serverless认证服务在iOS平台实现手机号注册
- IOS经常使用的性能优化策略
- iOS UIApplication的代理方法总结
- iOS - 重写set和get方法后,为什么使用时会发生无效?解析命名规范
- iOS开发 - ScrollView滚动时怎么判断滚动停止及滚动的方向
- iOS开发 - 关于MJRefresh刷新崩溃的问题
- iOS开发-本地推送实现方法和数据处理方案(一)
- iOS开发-本地推送实现方法和数据处理方案(二)
- iOS - 获取安装所有App的Bundle ID
- iOS 3DES加解密
- iOS解析json的4种方法