iOS开发之模拟iOS7毛玻璃效果
方法一:
利用UIToolbar来实现是最简单的毛玻璃效果。需要什么控件自行添加到toolbar上就OK。
初始化UIToolbar,设置toolbar样式为UIBarStyleBlackTranslucent或者UIBarStyleBlackOpaque 即可。修改bartintcolor的RGB值 可修改毛玻璃色调效果。
方法二:
根据UIGraphicsBeginImageContext获取当前视图截图,生成一个新的UIImage,将这个image添加高斯模糊的效果后在赋值给一个layer的contents属性,再把这层layer添加到view上即可。
下边是传递一个image添加高斯模糊的方法(要修改高斯模糊参数可在方法里自行修改):
//高斯模糊效果
//参考文档:http://www.zhihu.com/question/21260575/answer/18401841;
-(UIImage *)PixelImageWithImage:(UIImage *)image
{
NSInteger boxSize = (NSInteger)(10 * 5);
boxSize = boxSize - (boxSize % 2) + 1;
CGImageRef imgRef = image.CGImage;
vImage_Buffer inBuffer,outBuffer;
vImage_Error error;
void *pixelBuffer,*convertBuffer;
//01 从传入的image创建vImage_buffer的转换前数据
CGDataProviderRef inProvider = CGImageGetDataProvider(imgRef);
CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
//确定转换image为位图以后的宽高以及行数
inBuffer.width = CGImageGetWidth(imgRef);
inBuffer.height = CGImageGetHeight(imgRef);
inBuffer.rowBytes = CGImageGetBytesPerRow(imgRef);
inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
pixelBuffer = malloc(CGImageGetBytesPerRow(imgRef)*CGImageGetHeight(imgRef));
if (!pixelBuffer) {
NSLog(@"视图获取错误");
}
//02 从传入的image转换成的vImage_buffer进行转换并输出
outBuffer.width = CGImageGetWidth(imgRef);
outBuffer.height = CGImageGetHeight(imgRef);
outBuffer.rowBytes = CGImageGetBytesPerRow(imgRef);
outBuffer.data = pixelBuffer;
convertBuffer = malloc(CGImageGetBytesPerRow(imgRef)*CGImageGetHeight(imgRef));
error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
if (error) {
NSLog(@"视图转换错误:%zd",error);
}
//采用RGB颜色混合模式
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
//从位图数据转换到context
CGContextRef contextRef = CGBitmapContextCreate(outBuffer.data, outBuffer.width, outBuffer.height, 8, outBuffer.rowBytes, colorSpace, kCGImageAlphaNoneSkipLast);
//从contextRef得到新的image
CGImageRef newImageRef = CGBitmapContextCreateImage(contextRef);
image = [UIImage imageWithCGImage:newImageRef];
//释放内存
CGContextRelease(contextRef);
CFRelease(inBitmapData);
CGImageRelease(newImageRef);
free(pixelBuffer);
free(convertBuffer);
return image;
}
方法三:新建CIImage,添加高斯模糊滤镜
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setDefaults];
[filter setValue:image forKey:@"inputImage"];
UIImage *backImage = [UIImage imageWithCIImage:[filter outputImage]];
[filter setValue:[NSNumber numberWithInt:10] forKey:@"inputRadius"];
具体参数请自行Google或者查看API。