Ios 将CIFilter应用于CALayer

Ios 将CIFilter应用于CALayer,ios,cocoa-touch,calayer,core-image,Ios,Cocoa Touch,Calayer,Core Image,现在在iOS 5中可用,我正在尝试将其应用于CALayer。这是我的密码: CALayer *myCircle = [CALayer layer]; myCircle.bounds = CGRectMake(0,0,30,30); myCircle.position = CGPointMake(100,100); myCircle.cornerRadius = 15; myCircle.borderColor = [UIColor whiteColor].CGColor; myCircle.bo

现在在iOS 5中可用,我正在尝试将其应用于CALayer。这是我的密码:

CALayer *myCircle = [CALayer layer];
myCircle.bounds = CGRectMake(0,0,30,30);
myCircle.position = CGPointMake(100,100);
myCircle.cornerRadius = 15;
myCircle.borderColor = [UIColor whiteColor].CGColor;
myCircle.borderWidth = 2;
myCircle.backgroundColor = [UIColor whiteColor].CGColor;

CIFilter *blurFilter = [CIFilter filterWithName:@"CIDiscBlur"];
[blurFilter setDefaults];
[blurFilter setValue:[NSNumber numberWithFloat:5.0f] forKey:@"inputRadius"];
[myCircle setFilters:[NSArray arrayWithObjects:blurFilter, nil]];

[self.view.layer addSublayer:myCircle];

我的白圈画得很好,但是没有应用过滤器。

除了
CIDiskBlur
不可用(从iOS SDK 5.1开始)和
setFilters:
似乎不可用之外,您可以执行以下操作:

从图层内容创建输入图像:

CIImage *inputImage = [CIImage imageWithCGImage:(CGImageRef)(myCircle.contents)];`
应用过滤器并在CGImageRef中获得结果:

CIFilter *filter = [CIFilter filterWith...];// A filter that is available in iOS or a custom one :)
...
CIImage *outputImage = [filter outputImage];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
最后,将CGImageRef设置为图层:

[myCircle setContents:(id)cgimg];

这应该可以工作:)

来自CALayer文档:“iOS注意:虽然iOS中的CALayer类公开了filters属性,但核心映像不可用。当前此属性可用的筛选器未定义。”-因此我不确定它是否真的可以工作,iOS上的核心图像实现目前不支持Mac上的模糊过滤器:这取决于,我认为我们在过滤器内部做不了什么,我们可以尝试使用OpenGL直接绘制到图层,而不是创建CGImageRef和使用
setContents:
。此外,我们还可以提交错误报告并请求
setFilters:
,以便能够使用,然后静坐等待:p。您可能需要为最后一行上的ARC执行CfBrigingRelease(cgimg)。还需要[filter setValue:inputImage forKey:@“inputImage”];哦这个答案需要更新。我认为现在可以直接应用过滤器。。。。我会在以后更新这个答案:)如果不再打我。。是否可以直接设置过滤器?