2012-02-03 18 views
5

Tôi có chế độ xem bản đồ tùy chỉnh được tạo thành từ UIScrollView. Chế độ xem phụ của chế độ xem cuộn được hỗ trợ bởi CATiledLayer. Mọi thứ đều hoạt động tốt ở đây. Panning & phóng to tải lên các ô bản đồ mới và mọi thứ hoạt động tốt.chụp ảnh chụp nhanh chế độ xem được hỗ trợ bởi CATiledLayer trong UIScrollView

Điều tôi muốn làm là chụp các khung hình video hoạt ảnh về chế độ xem cuộn này. Về cơ bản, tôi muốn tạo một video các thay đổi hoạt hình cho chế độ xem cuộn của contentOffsetzoomScale.

Tôi biết rằng khái niệm là âm thanh khi tôi có thể nhận hàm API riêng UIGetScreenImage() để chụp màn hình của ứng dụng ở mức 10fps, kết hợp những hình ảnh này và tôi nhận được các hoạt ảnh phát lại mượt mà và có các đường cong thời gian được sử dụng các hoạt ảnh xem cuộn.

Vấn đề của tôi, tất nhiên, là tôi không thể sử dụng API riêng tư. Đi qua các lựa chọn thay thế được đưa ra bởi Apple here để lại cho tôi một lựa chọn đáng được cho là hợp lệ: yêu cầu một số CALayer đến renderInContext và lấy số UIGraphicsGetImageFromCurrentImageContext() từ đó.

Điều này dường như không hoạt động với chế độ xem mặc định là CATiledLayer. Hình ảnh bị thu nhỏ, không được thu phóng là hình ảnh được chụp, như thể các ô có độ phân giải cao hơn không bao giờ tải. Điều này phần nào có ý nghĩa cho rằng CATiledLayer rút ra trong chủ đề nền cho hiệu suất và gọi renderInContext từ chủ đề chính có thể không nắm bắt những cập nhật này. Kết quả là tương tự ngay cả khi tôi cũng hiển thị lớp của lớp lát gạch presentationLayer.

Có cách nào được Apple xử phạt để chụp ảnh của chế độ xem CATiledLayer được bảo vệ trong suốt quá trình xem hoạt ảnh của chế độ xem có cuộn không? Hoặc tại bất kỳ điểm nào, cho rằng vấn đề?

+0

người gửi câu trả lời ở đây: http://stackoverflow.com/questions/5526545/render-large-catiledlayer-into-smaller- diện tích –

Trả lời

1

BTW, điều này có thể thực hiện được nếu bạn triển khai đúng renderLayer:inContext: trong chế độ xem CATiledLayer được sao lưu của mình.

0

Tôi đã làm một bài kiểm tra nhanh và sử dụng renderInContext: trên một chế độ xem bao quanh chế độ xem cuộn có vẻ hoạt động. Bạn đã thử chưa

+0

Có. Tôi đã đưa ra một số mã mẫu cho thấy vấn đề này gọn gàng hơn: https://github.com/incanus/TiledLayerSnapTest Lưu ý rằng một capture của một 'UIView' bình thường hoạt động tốt, nhưng khung nhìn' CATiledLayer' được đưa ra trống màu xám. – incanus

0

Mã này phù hợp với tôi.

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

}

Full mẫu mã tìm thấy ở đây: https://github.com/gortega56/CCCanvasView

Các vấn đề liên quan