我正在应用程序中实现“临时”功能。用户刮擦屏幕并看到“下方”图像。
在touchesMoved上:我更新蒙版图像并将其应用于图层。一般的代码是这样的:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGPoint cPoint = [touch locationInView:self];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.bounds];
imageView.image = _maskImage;
// ... add some subviews to imageView corresponding to touch manner
_maskImage = [UIImage imageFromLayer:imageView.layer];
[self setNeedsDisplay];
}
- (void)drawRect:(CGRect)rect
{
_maskImageView.image = _maskImage;
_viewWithOurImage.layer.mask = _maskImageView.layer;
}
我使用代码(UIImage上的类别)从CALayer获取UIImage:
+ (UIImage*)imageFromLayer:(CALayer*)layer
{
UIGraphicsBeginImageContextWithOptions([layer frame].size, NO, 0);
[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return outputImage;
}
此代码在iOS6上完美运行(在iPhone 4s和iPad2上测试),完全没有滞后。
但是,当我在iOS7(xcode4或xcode5)上运行它时,它的运行速度非常缓慢且缓慢。我使用了一个时间分析器,它显然指向renderInContext:行。
然后我尝试了以下代码:
...
if (SYSTEM_VERSION_LESS_THAN(@"7.0"))
_maskImage = [UIImage imageFromLayer:imageView.layer];
else
_maskImage = [UIImage imageFromViewIniOS7:imageView];
...
+ (UIImage*)imageFromViewIniOS7:(UIView*)view
{
UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0);
CGContextSetInterpolationQuality(UIGraphicsGetCurrentContext(), kCGInterpolationNone);
// actually there is NSInvocation, but I've shortened for example
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return outputImage;
}
而且它仍然很慢。在iPhone 4s(与iOS6相同),新的iPod5和iPad3上进行了测试。
我究竟做错了什么?显然这是iOS7的问题...
我将不胜感激任何建议。
最佳答案
我会建议您尝试其他方法,对不起, touchesMoved 函数在IOS7中运行缓慢,您的代码没有错
关于ios - RenderInContext在iOS7上非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19630088/