2016-04-25 29 views
0

我發現這個代碼是完美的。但它使用scrollview的大小。我想用我的尺寸。iOS - 使用尺寸截取UIScrollView可見區域?

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

EDIT

scrollView我尺寸爲350×350。我加入imageView作爲其子視圖。 用戶可以縮放和滾動scrollView。

用戶完成縮放/滾動後,用戶可以點擊保存按鈕。此按鈕需要我的屏幕快照scrollView

從上面的代碼。我的截屏圖像大小爲350 x 350(與scrollView大小相同)。我想截取大小爲1040 x 1040的scrollView並獲得正確的縮放/滾動區域。

我知道,我可以做這個改變大小:

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

但我不知道如何根據新的尺寸改變抵消一部分。

+0

可以傳遞到CGSize UIGraphicsBeginImageContext(imgV.frame.size); –

+0

是的,我知道這一點。事情是我的滾動視圖將得到放大。我不知道如何設置結果圖像的偏移量。如果你確實知道答案,請幫助我。謝謝。 – imstillalive

+0

@imstillalive所以你不想改變結果圖像的大小,你只是想提供一個自定義的偏移量來定義滾動視圖的部分渲染? – Hamish

回答

0

如果您使用drawViewHierarchyInRect:,則可以跳過關於內容偏移量和縮放比例的操作。它只會在給定的矩形中呈現滾動視圖的可見區域。

這將允許您傳遞自定義尺寸,並將相應地放大或縮小。

例如:

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

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

如果你仍想使自己的圖層,然後你只需要根據你的新尺寸的滾動視圖的大小比例縮放上下文(renderInContext使用圖層的大小,而不是上下文的大小),然後用內容偏移來抵消。

例如:

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