/ / RenderInContext е невероятно бавен на iOS7 - ios, aim-c, ios7

RenderInContext е невероятно бавен за iOS7 - ios, objective-c, ios7

Внедрявам функционалността „скреч“ в моето приложение. Потребителят драска екрана и вижда изображението „отдолу“.

При 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: row.

Тогава опитах следния код:

...
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 ...

Ще оценя всякакви предложения.

Отговори:

3 за отговор № 1

Ще ви предложа да опитате по друг начин, както съжалявам да кажа touchesMoved функцията работи бавно в IOS7, няма нищо лошо в кода ви