對於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需要大量的時間,我正在尋找image processing using the Accelerate framework來了解如何讓我的版本更流暢。
請注意,鏈接的解決方案適用於Mac,您可以在其中爲視圖提供核心圖像過濾器一段時間。我不相信你可以在iOS上使用UIViews和CALayers來做到這一點,但我可能在最近的更新中遺漏了一些東西。 – 2013-03-27 21:59:12