Я ищу для Quartz 2D эксперта, который мог бы быть в состоянии видеть ошибку в следующем коде:Quartz 2D Эксперты - метод маскирования врезается программы после того, как 6 или 7 последовательных вызовов
self.imageView.image = [self maskView:self.imageView withMask:[self createMaskForTool:self.toolView modifyForOutline:NO]];
- (UIImage *)maskView:(UIView *)view withMask:(UIImage *)maskImage
{
UIGraphicsBeginImageContext(view.bounds.size);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
CGImageRef masked = CGImageCreateWithMask([viewImage CGImage], mask);
UIImage *resultingImage = [UIImage imageWithCGImage:masked];
CGImageRelease(mask);
CGImageRelease(masked);
return resultingImage;
}
- (UIImage *)createMaskForTool:(Tool *)tool modifyForOutline:(BOOL)forOutline
{
UIGraphicsBeginImageContext(self.imageView.frame.size);
// Draw black mask background
[[UIImage imageNamed:@"mask.png"] drawInRect:CGRectMake(0, 0, self.imageView.frame.size.width, self.imageView.frame.size.height)];
// Draw white mask shape
CGSize aspectRatioCorrectToolSize = [self aspectRatioCorrectSizeForImage:tool.maskImage toFitInSize:tool.frame.size];
[self.toolView.maskImage drawInRect:CGRectMake((tool.frame.origin.x+(tool.frame.size.width-aspectRatioCorrectToolSize.width)/2)-self.imageView.frame.origin.x+(forOutline ? OUTLINE_THICKNESS : 0),
(tool.frame.origin.y+(tool.frame.size.height-aspectRatioCorrectToolSize.height)/2)-self.imageView.frame.origin.y+(forOutline ? OUTLINE_THICKNESS : 0),
aspectRatioCorrectToolSize.width-(forOutline ? OUTLINE_THICKNESS : 0)*2,
aspectRatioCorrectToolSize.height-(forOutline ? OUTLINE_THICKNESS : 0)*2)];
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resultingImage;
}
Эти методы постепенно замаскируйте изображение. Приложение начинается с полного изображения, и пользователь может использовать инструменты для «измельчения отверстий» через изображение. Чтобы создать эффект дыры, я сначала создаю маску с помощью createMaskForTool: modifyForOutline: затем используйте полученную маску в maskView: withMask: применить маску к изображению. Новое замаскированное изображение затем заменяет существующий imageView.image, и новое изображение используется в качестве базового изображения в следующий раз, когда будет вырезано новое отверстие. Мы пробивали код, чтобы найти другие утечки, которые могут вызвать предупреждения о памяти, которые мы получаем, но неизменно после того, как вы назовете эти маскирующие функции 6 или 7 раз подряд, приложение выйдет из строя.
Это может конкретно ответить на мой вопрос;) Я на самом деле просто ищу лучший способ замаскировать изображение ... Я попробую установить свойство маски слоя и посмотреть, что произойдет. Благодаря! – RyJ