/ / RenderInContext неймовірно повільний на iOS7 - ios, object-c, ios7

RenderInContext неймовірно повільно працює в iOS7 - ios, object-c, ios7

Я реалізую функцію "нуля" у своїй програмі. Користувач дряпає екран і бачить зображення "внизу".

На touchchesMoved: я оновлюю зображення маски і наношу її на шар. Загалом код такий:

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

Я запропоную вам спробувати інший спосіб, як шкода сказати доторкається до рук Функція працює повільно в IOS7, у вашому коді нічого поганого