Cocoa Touch: маска игнорируется при рендеринге изображения: renderInContext:UIGraphicsGetCurrentContext()

Я пытаюсь отобразить вид в маске, используя renderInContext:UIGraphicsGetCurrentContext(). Я маскирую представление белого цвета, которое является подпредставлением представления серого цвета. Это прекрасно работает для отображения: я получаю белую фигуру на сером фоне, но при рендеринге маска игнорируется, и все, что я вижу, — это белое изображение в результирующем изображении.

Маска в подклассе UIView

- (void)drawRect:(CGRect)rect
{
        CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
        CGMutablePathRef patheToMask = CGPathCreateMutable();
        CGRect scrollMaskRect = CGRectMake(30, 30, 100, 100);
        UIBezierPath *scrollMask = [UIBezierPath bezierPathWithRoundedRect:scrollMaskRect cornerRadius:30];
        CGPathAddPath(patheToMask, nil, scrollMask.CGPath);
        [maskLayer setPath:patheToMask];
        CGPathRelease(patheToMask);
        self.layer.mask = maskLayer;
}

код рендеринга

-(void)renderImage {
    CGSize renderSize = CGSizeMake(masterView.frame.size.width, masterView.frame.size.height);
    UIGraphicsBeginImageContext(renderSize);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextConcatCTM(context, [[masterView layer] affineTransform]);
    [[masterView layer] renderInContext:UIGraphicsGetCurrentContext()];
    renderedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    CGContextRestoreGState(context);
    UIImageWriteToSavedPhotosAlbum(renderedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    masterView.transform = CGAffineTransformIdentity;
}

Вот проект http://owolf.net/uploads/StackOverflow/MaskWeirdness.zip


person Mr Wolf    schedule 25.04.2013    source источник


Ответы (1)


Согласно документации, renderInContext:UIGraphicsGetCurrentContext() не поддерживает маскирование.

https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CALayer_class/Introduction/Introduction.html

Из документов:

Важно: Реализация этого метода в OS X v10.5 не поддерживает всю модель композиции Core Animation. Слои QCCompositionLayer, CAOpenGLLayer и QTMovieLayer не визуализируются. Кроме того, слои, использующие 3D-преобразования, не визуализируются, равно как и слои, в которых указаны значения backgroundFilters, filter, compositingFilter или маски. В будущих версиях OS X может быть добавлена ​​поддержка рендеринга этих слоев и свойств.

person Mr Wolf    schedule 11.05.2013