如何在UIView的layerClass实例上使用CIFilter?

我的UIView使用TBPaperLayer的实例作为其图层。

+(Class)layerClass { return [TBPaperLayer class]; } 

我想创build一个CIFilter来修改这个图层的外观 – 尤其是在它上面应用模糊滤镜。 我怎样才能使用这段代码来模糊这一层的一部分? (代码来自: Blur CALayer的Superlayer )

 CALayer *blurLayer = [CALayer layer]; CIFilter *blur = [CIFilter filterWithName:@"CIGaussianBlur"]; [blur setDefaults]; blurLayer.backgroundFilters = [NSArray arrayWithObject:blur]; [self.superlayer addSublayer:blurLayer]; 

-init没有超级玩家。

这在iOS上是不可能的。 从CALayer类参考 :

特别注意事项

iOS中的图层不支持此属性。

据推测,苹果公司并不认为目前这一代的iOS硬件足够强大,足以支持实时图像过滤。

对于iOS 6.1,我想要一个视图,它封装了用于标题序列的某些运动graphics中缩小的内向和去模糊效果。 我的结果代码(并非全部显示在这里)稳定地减小了伸展因子(向内缩小文本的水平尺度)和模糊量。 应用此效果的文本呈现为UIBezierPath并存储在self.myPath中。 计时器触发减less两个值并调用setNeedsDisplay的方法。

 - (void)displayLayer:(CALayer *)layer { UIGraphicsBeginImageContext(self.bounds.size); CGContextRef ctx = UIGraphicsGetCurrentContext(); CGAffineTransform stretch = CGAffineTransformMakeScale(self.stretchFactor + 1.0, 1.0); CGPathRef stretchedPath = CGPathCreateCopyByTransformingPath([self.myPath CGPath], &stretch); CGRect newBox = CGPathGetBoundingBox(stretchedPath); float deltaX = CGRectGetMidX(self.bounds) - CGRectGetMidX(newBox); float deltaY = CGRectGetMidY(self.bounds) - CGRectGetMidY(newBox); CGAffineTransform slide = CGAffineTransformMakeTranslation(deltaX, deltaY); CGPathRef centeredPath = CGPathCreateCopyByTransformingPath(stretchedPath, &slide); CGPathRelease(stretchedPath); CGContextAddPath(ctx, centeredPath); CGPathRelease(centeredPath); CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]); CGContextFillPath(ctx); UIImage *tmpImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CIImage *inputImage = [CIImage imageWithCGImage:[tmpImage CGImage]]; CIFilter *gBlurFilter = [CIFilter filterWithName:@"CIGaussianBlur" keysAndValues:@"inputRadius", [NSNumber numberWithFloat:self.blurFactor], @"inputImage", inputImage, nil]; CIImage *blurredImage = [gBlurFilter outputImage]; CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef cgimg = [context createCGImage:blurredImage fromRect:[blurredImage extent]]; [layer setContents:(__bridge id)cgimg]; CGImageRelease(cgimg); } - (void)drawRect:(CGRect)rect { // empty drawRect: to get the attention of UIKit } 

我还没有检查这个代码的泄漏,所以认为它是“伪代码”:-)如图所示,这可能已经在drawRect:和不使用的层内完成,但我有其他的事情正在进行此视图不显示在这浓缩版本。

但是由于CIGaussianBlur需要大量的时间,所以我正在研究使用Accelerate框架进行image processing来了解如何使我的版本更加stream畅。