2013-09-23 37 views
28

我想實現與Facebook分享應用程序。 我用這個代碼採取截圖:爲什麼我在iOS 7上以編程方式創建屏幕截圖看起來很糟糕?

CGSize imageSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height); 
UIGraphicsBeginImageContext(imageSize); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

它適用於iOS 6很棒,但在搭載iOS 7的圖像看起來很糟糕。 我用這樣的回答:iOS: what's the fastest, most performant way to make a screenshot programmatically? 對試圖修復它,而且它的幫助下,仍然截圖很糟糕。 屏幕獲得另一種顏色,並且某些對象(如標籤)未在拍攝的圖像上顯示。 有什麼幫助嗎?

---- ----更新

我設法解決大多數對象,通過改變他們保留的,而不是軟弱。我的主要問題仍然是我的桌面視圖,它顯示爲一個大的白色塊(它應該是透明的,帶有白色文本的標籤,所以我們看到的只是白色的單元格)。我曾嘗試定義表格背景clearcolor,不利於..

----最後更新---

這裏有一些不是真正關於我的問題。我想做出精彩解答它可以在使用iOS7運行但不使用iOS7 SDK的設備上工作,因爲在項目即將完成時,需要付出很大的努力來切換項目SDK。

不管怎麼說,我添加的代碼,終於解決了我的問題和平:

這種變化根本解決問題:

UIGraphicsBeginImageContextWithOptions(imageSize, NO , 0.0f); 

代替:

UIGraphicsBeginImageContext(imageSize); 

回答

53

API一直自iOS 7以來增加,應該提供快照的有效方式

  • snapshotViewAfterScreenUpdates:呈現視圖與不可修改的content

  • resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets一個UIView:同樣的事情,但可調整大小的插圖

  • drawViewHierarchyInRect:afterScreenUpdates::同樣的事情,如果你需要太得出所有子視圖(如標籤,按鈕...)

像你這樣你可以使用UIView返回任何UI效果,或者渲染成圖像如果你需要出口。

我不知道這種新方法有多好,執行VS時提供的(雖然我記得蘋果公司的工程師說,這個新的API是更有效)

+0

感謝這個漂亮的答案。我的應用程序現在與iOS 7 SDK不兼容。我沒有時間進行所有必要的更改並替換所有已棄用的類。我使用iOS 6 SDK在iOS7上運行我的應用程序。我在所有應用中遇到的唯一問題就是這個截圖。你有一個想法,我該怎麼辦? – Yossi

+3

我認爲,您當前的代碼有1個問題可能是不考慮尺度(是視網膜設備?)。你可以使用'UIGraphicsBeginImageContextWithOptions(imageSize,NO,0.0)'(最後一個參數是圖像的比例,設置爲0.0可以確保函數選擇設備主屏幕的比例) – Vinzzz

+0

您的評論最接近我使用的解決方案:) – Yossi

30

你可以試試這個

- (UIImage *) screenshot { 
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale); 

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

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
} 
+0

與第一個答案相同,這是新的iOS 7 API。我的應用遠不支持iOS 7 SDK。它將在未來,但我現在需要一個解決方案:) – Yossi

+0

如何在iOS的任何視圖截圖不僅在我的應用程序內? – Suge

+0

[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];我會在iPhone 6上使整個屏幕閃爍。我必須使用「[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:NO];」代替。爲什麼 ? – noooooooob

0

製作確保opaque設置爲NO

+0

是什麼原因? – teradyl

+0

renderInContext是純粹的CPU組合和渲染,它不同於普通的基於OpenGL的合成引擎,因此它將不透明標誌對待。 –

5

在iOS7你可以,如果你使用的毛刺

[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES] 

正在進行的動畫。設置afterScreenUpdates = NO擺脫毛刺。

+1

謝謝!每當我捕捉屏幕時,我都會在最近3個小時內瘋狂地出現奇怪的故障。我的代碼在applicationDidEnterBackground中被調用:它導致任何動畫在返回到應用程序時凍結。 – Dermot

6

在iOS的8:我這是怎麼做的,以獲得截圖

  1. 只是增加一個的UIImageView和方法採取截圖在.h文件中

@property(弱,非原子)IBOutlet UIImageView * imageView;

-(IBAction)takeSnapShot:(id)sender; 

2添加的代碼剪斷用於取截屏和在.m文件上的UIImageView 設置

- (IBAction)takeSnapShot:(id)sender 
{ 
    UIGraphicsBeginImageContext(self.view.bounds.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *snapShotImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    imageView.image = snapShotImage; 
} 
  • 下面是我得到的輸出。
  • enter image description here

    相關問題