如何使用CIFilter上的UIView的layerClass实例?(How to use a CI

2019-08-18 01:44发布

我UIView使用TBPaperLayer的实例,其层。

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

我想创建一个CIFilter修改该层的出现 - 尤其是它应用模糊滤镜。 我怎样才能使用此代码混淆这个层的一部分? (代码: 模糊的CALayer的Superlayer )

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

有期间没有superlayer -init

Answer 1:

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

特别注意事项

不支持在iOS的层这个属性。

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



Answer 2:

对于iOS 6.1我想的是封装在一些运动图形标题序列中使用的向内收缩和去模糊效果的图。 我的结果代码(不是所有的在此示出)稳定地减小两个伸长率(向内缩小文本的水平刻度)和模糊量。 针对该效果应用的文本呈现为UIBezierPath并存储在self.myPath。 计时器触发降低所述两个值并调用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所花的时间明显的量,我期待在使用加速框架图像处理看到有关使我的版本更流畅。



文章来源: How to use a CIFilter on the layerClass instance of an UIView?