iOS - 使用Size获取UIScrollView可见区域的屏幕截图?

时间:2016-04-25 14:58:15

标签: ios objective-c uiscrollview

我发现这段代码完美无缺。但它使用了scrollview的大小。我想用我的尺码。

UIScrollView *contentScrollView;....//scrollview instance

UIGraphicsBeginImageContextWithOptions(contentScrollView.bounds.size, 
                                       YES, 
                                       [UIScreen mainScreen].scale);

//this is the key
CGPoint offset=contentScrollView.contentOffset;
CGContextTranslateCTM(UIGraphicsGetCurrentContext(), -offset.x, -offset.y); 

[contentScrollView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *visibleScrollViewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

如果我想使用我的CGSize,我应该对CGContextTranslateCTM使用什么?

修改

我的scrollView尺寸为350 x 350.我添加了imageView作为其子视图。 用户可以缩放和滚动scrollView。

用户完成缩放/滚动后,用户可以单击“保存”按钮。此按钮采用我的scrollView

的屏幕截图

从上面的代码。我的屏幕截图图像大小为350 x 350(与scrollView大小相同)。我想截取大小为1040 x 1040的scrollView截图,并获得正确的缩放/滚动区域。

我知道我可以通过这样做来改变大小:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(1040, 1040), YES, [UIScreen mainScreen].scale);

但我不知道如何根据新尺寸更改偏移部分。

1 个答案:

答案 0 :(得分:0)

如果您使用drawViewHierarchyInRect:,则可以跳过内容偏移和缩放开始。它将简单地渲染给定矩形中滚动视图的可见区域。

这将允许您传递自定义尺寸,并相应地按比例放大或缩小。

例如:

CGSize size = (CGSize){1040, 1040};

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
[scrollView drawViewHierarchyInRect:(CGRect){CGPointZero, size} afterScreenUpdates:NO];
UIImage* img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

如果你仍然想自己渲染图层,那么你只需要根据新尺寸与滚动视图大小的比例来缩放上下文(因为renderInContext使用了图层' s大小,而不是上下文的大小),然后由内容偏移量抵消。

例如:

CGSize size = (CGSize){1040, 1040};

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();

CGContextScaleCTM(ctx, size.width/scrollView.bounds.size.width, size.height/scrollView.bounds.size.height);
CGContextTranslateCTM(ctx, -scrollView.contentOffset.x, -scrollView.contentOffset.y);
[scrollView.layer renderInContext:ctx];

UIImage* img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();