При создании снимка экрана путем рисования UIView поверх UIImage с renderInContext мой UIImage не отображается - PullRequest
1 голос
/ 03 августа 2011

Я использую пример кода из http://developer.apple.com/library/ios/#qa/qa1714/_index.html почти дословно, и я могу сохранить свое фоновое изображение или наложение, но я не могу объединить их. Когда я пытаюсь объединить их, используя следующий код, наложение делает фон белым, и я предполагаю, что оно перезаписывает фон. Есть идеи, почему это так?

Вот мой метод, который пытается объединить наложение вида с изображением:

-(void) annotateStillImage
{
    UIImage *image = stillImage;

    // Create a graphics context with the target size
    CGSize imageSize = [[UIScreen mainScreen] bounds].size;
    UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);

    CGContextRef context = UIGraphicsGetCurrentContext();


    // Draw the image returned by the camera sample buffer into the context. 
    // Draw it into the same sized rectangle as the view that is displayed on the screen.
    UIGraphicsPushContext(context);

    [image drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
    UIGraphicsPopContext();

    // -renderInContext: renders in the coordinate space of the layer,
    // so we must first apply the layer's geometry to the graphics context
    CGContextSaveGState(context);
    // Center the context around the window's anchor point
    CGContextTranslateCTM(context, [[self view] center].x, [[self view] center].y);
    // Apply the window's transform about the anchor point
    CGContextConcatCTM(context, [[self view] transform]);
    // Offset by the portion of the bounds left of and above the anchor point
    CGContextTranslateCTM(context,
                          -[[self view] bounds].size.width * [[[self view] layer] anchorPoint].x,
                          -[[self view] bounds].size.height * [[[self view] layer] anchorPoint].y);

    // Render the layer hierarchy to the current context
    [[[self view] layer] renderInContext:context];

    // Restore the context
    CGContextRestoreGState(context);

    // Retrieve the screenshot image containing both the camera content and the overlay view
    stillImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
}

Вот фрагмент моего метода, который создает представление в случае, если это уместно:

CGRect layerRect = [[[self view] layer] bounds];
[[self previewLayer] setBounds:layerRect];
[[self previewLayer] setPosition:CGPointMake(CGRectGetMidX(layerRect),  CGRectGetMidY(layerRect))];
[[[self view] layer] addSublayer:[self previewLayer]];

UIButton *overlayButton = [UIButton buttonWithType:UIButtonTypeCustom];
[overlayButton setImage:[UIImage imageNamed:@"acceptButton.png"] forState:UIControlStateNormal];
[overlayButton setFrame:[self rectForAcceptButton] ];
[overlayButton setAutoresizesSubviews:TRUE];
[overlayButton setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin];
[overlayButton addTarget:self action:@selector(acceptButtonPressed) forControlEvents:UIControlEventTouchUpInside];
[[self view] addSubview:overlayButton];

Я ожидаю, что изображение в методе аннотирования будет фоном, а кнопка подтверждения из видового чертежа будет добавлена ​​сверху. Все, что я получаю, это кнопку «Принять» и белый фон, но если я не запускаю метод renderInContext, все, что я получаю, это фон изображения и отсутствие наложения.

Спасибо!

1 Ответ

2 голосов
/ 04 августа 2011

Оказывается, я добавил оверлей к тому же виду, что и слой предварительного просмотра, вместо того, чтобы иметь его в своем собственном виде.Я понял это, просмотрев этот замечательный проект, который охватывает все возможные типы скриншотов: https://github.com/cocoacoderorg/Screenshots

Исправлено: создание отдельного вида наложения в IB с прозрачным фоном и добавление к нему моих элементов наложения.

...