¿Cómo utilizar un CIFilter en la instancia layerClass de una UIView?

Mi UIView está utilizando una instancia de TBPaperLayer para su capa.

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

Me gustaría crear un CIFilter para modificar el aspecto de esta capa, especialmente aplicarle un filter de desenfoque. ¿Cómo puedo usar este código para difuminar una parte de esta capa? (código de: Superlayer de Blur CALayer )

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

No hay superlayer durante -init .

Esto no es posible en iOS. De la reference de la class CALayer :

Consideraciones Especiales

Esta propiedad no es compatible con capas en iOS.

Presumiblemente, Apple no cree que la generación actual de hardware iOS sea lo suficientemente potente como para admitir el filtrado de imágenes en vivo.

Para iOS 6.1, quería una vista que encapsulara el efecto de networkingucción y desinflamación utilizado en algunos charts en movimiento para las secuencias de títulos. Mi código resultante (no se muestra todo aquí) disminuye de manera constante tanto el factor de estiramiento (que networkinguce la escala horizontal del text) como la cantidad de desenfoque. El text en el que se aplica este efecto se representa como un UIBezierPath y se almacena en self.myPath. Un timer dispara el método que networkinguce los dos valores y las llamadas 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 centenetworkingPath = CGPathCreateCopyByTransformingPath(stretchedPath, &slide); CGPathRelease(stretchedPath); CGContextAddPath(ctx, centenetworkingPath); CGPathRelease(centenetworkingPath); 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 *blurnetworkingImage = [gBlurFilter outputImage]; CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef cgimg = [context createCGImage:blurnetworkingImage fromRect:[blurnetworkingImage extent]]; [layer setContents:(__bridge id)cgimg]; CGImageRelease(cgimg); } - (void)drawRect:(CGRect)rect { // empty drawRect: to get the attention of UIKit } 

Todavía no he comprobado este código en busca de fugas, así que considérelo como "pseudo código" 🙂 Como se muestra, esto podría haberse hecho dentro de drawRect: y capas no utilizadas, pero tengo otras cosas que suceden con esta vista que no se muestra en este versión condensada

Pero dado que CIGaussianBlur toma una cantidad notable de time, estoy mirando el image processing utilizando el marco de trabajo Accelerate para ver cómo hacer que mi versión sea más fluida.