2013-12-13 112 views
20

我有一個視圖(testView)是400x320,我需要截取此視圖的一部分(比如rect =(50,50,200,200))。 我正在玩iOS 7中的drawViewHierarchy方法,但我無法弄清楚如何正確地做到這一點。iOS 7截取部分UIView的屏幕截圖

UIGraphicsBeginImageContextWithOptions(self.testView.bounds.size, NO, [UIScreen mainScreen].scale); 

    [self.testView drawViewHierarchyInRect:self.testView.bounds afterScreenUpdates:YES]; 

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

任何幫助將不勝感激!

謝謝。

回答

34

得到整個快照後,你可以借鑑它在一個較小的圖形上下文中,你得到你想要的部分方式:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), YES, [UIScreen mainScreen].scale); 
[image drawInRect:CGRectMake(-50, -50, image.size.width, image.size.height)]; 
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

編輯:更重要的是,直接繪製的分層結構,該較小的上下文:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, [UIScreen mainScreen].scale); 
[self.testView drawViewHierarchyInRect:CGRectMake(-50, -50, self.testView.bounds.size.width, self.testView.bounds.size.height) afterScreenUpdates:YES]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

謝謝!這幫了我很多! – Max

+0

在Swift中使用'self.hostView.superview!.drawHierarchy(in:frame,afterScreenUpdates:true)'其中'frame'肯定小於'superView',我仍然可以看到完整視圖的內容。但它壓縮到我提供給'UIGraphicsBeginImageContextWithOptions()'(我當然與我的'frame'的'size'相同)的'CGSize'。 –

+1

@意義 - 這裏的技巧是通過使用與您的視圖完全相同的大小(以防止縮放)來繪製層次結構,並抵消它以獲得所需的部分。通過使用'UIGraphicsBeginImageContextWithOptions(CGSize(width:200,height:200),true,0)',你可以用view.drawHierarchy(in:view.bounds,afterScreenUpdates:true)得到視圖的左上角200x200部分' 。你也可以通過這種方式來抵消零件:'view.drawHierarchy(in:UIEdgeInsetsInsetRect(view.bounds,UIEdgeInsets(top:-100,left:-100,bottom:0,right:0)),afterScreenUpdates:true) '。希望能幫助到你! – Rufel

0

嘗試下面的代碼行,

UIView *popSnapshot=[inputView snapshotViewAfterScreenUpdates:YES];