2012-02-03 6 views
5

У меня есть пользовательский вид карты, который сделан из UIScrollView. Подвью просмотра прокрутки поддерживается CATiledLayer. Здесь все отлично работает. Panning & масштабирование загружает новые плитки карты, и все работает хорошо.Съемка снимка с поддержкой CATiledLayer в UIScrollView

Что я хочу сделать, так это захватить кадры видео анимации в этот вид прокрутки. По сути, я хочу создать видео анимированных изменений в виде прокрутки contentOffset и zoomScale.

Я знаю, что концепция звучит так, как я могу получить частную функцию API UIGetScreenImage(), чтобы захватить экран приложения, скажем, 10 кадров в секунду, объединить эти изображения, и я получаю анимационные анимации, которые являются гладкими и имеют кривые времени, используемые анимации прокрутки.

Моя проблема, конечно, в том, что я не могу использовать частный API. Пройдя альтернативы, описанные Apple, here оставляет меня с довольно вероятным вариантом: прошу CALayer - renderInContext и взять UIGraphicsGetImageFromCurrentImageContext().

Это, похоже, не работает с CATiledLayer -backed views. Блочное, не увеличенное изображение - это то, что захвачено, как будто плитки с более высоким разрешением никогда не загружаются. Это несколько имеет смысл, учитывая, что CATiledLayer рисует в фоновом потоке производительность, а вызов renderInContext из основного потока может не поймать эти обновления. Результат аналогичен, даже если я создаю слой черепичного слоя.

Есть ли у Apple способ санкционированного изображения захвата изображения CATiledLayer во время просмотра анимации прокрутки? Или в любой момент, если на то пошло?

+0

Кто-то отправил ответ здесь: http://stackoverflow.com/questions/5526545/render-large-catiledlayer-into-smaller- площадь –

ответ

1

BTW, это выполнимо, если вы правильно реализуете renderLayer:inContext: в своем CATiledLayer -backed view.

0

Я проверил быструю проверку и использовал renderInContext: при просмотре, похоже, работала прокрутка. Вы пробовали это?

+0

Да. Я привел пример кода, который более подробно демонстрирует эту проблему: https://github.com/incanus/TiledLayerSnapTest Обратите внимание, что захват обычного 'UIView' отлично работает, но просмотр с поддержкой CATiledLayer закрывается серый. – incanus

0

Этот код работает для меня.

- (UIImage *)snapshotImageWithView:(CCTiledImageScrollView *)view 
{ 
// Try our best to approximate the best tile set zoom scale to use 
CGFloat tileScale; 
if (view.zoomScale >= 0.5) { 
    tileScale = 2.0; 
} 
else if (view.zoomScale >= 0.25) { 
    tileScale = 1.0; 
} 
else { 
    tileScale = 0.5; 
} 

// Calculate the context translation based on how far zoomed in or out. 
CGFloat translationX = -view.contentOffset.x; 
CGFloat translationY = -view.contentOffset.y; 
if (view.contentSize.width < CGRectGetWidth(view.bounds)) { 
    CGFloat deltaX = (CGRectGetWidth(view.bounds) - view.contentSize.width)/2.0; 
    translationX += deltaX; 
} 
if (view.contentSize.height < CGRectGetHeight(view.bounds)) { 
    CGFloat deltaY = (CGRectGetHeight(view.bounds) - view.contentSize.height)/2.0; 
    translationY += deltaY; 
} 

// Pass the tileScale to the context because that will be the scale used in drawRect by your CATiledLayer backed UIView 
UIGraphicsBeginImageContextWithOptions(CGSizeMake(CGRectGetWidth(view.bounds)/view.zoomScale, CGRectGetHeight(view.bounds)/view.zoomScale), NO, tileScale); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(context, translationX/view.zoomScale, translationY/view.zoomScale); 

// The zoomView is a subview of UIScrollView. The CATiledLayer backed UIView is a subview of the zoomView. 
[view.zoomView.layer renderInContext:context]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return image; 

}

Полный пример кода здесь: https://github.com/gortega56/CCCanvasView

 Смежные вопросы

  • Нет связанных вопросов^_^