2012-09-05 84 views
3

我使用核芯顯卡把我的UIView的截圖,然後將其放置在該視圖的頂部(所以我可以在以後製作動畫):核芯顯卡截圖沒有隱藏物品

// Get the screen shot 
UIGraphicsBeginImageContextWithOptions(target.bounds.size, YES, [[UIScreen mainScreen] scale]); 
[target.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIImageView * ss = [[UIImageView alloc] initWithImage:image]; 

// Add it to the View 
[overlay addSubview:ss]; 
[target addSubview:overlay]; 

問題:我的UIView target有一些看不見的東西(我試過alpha = 0hidden = YES)。這些不可見的項目出現在屏幕截圖中。

如何在沒有這些隱形物品的情況下拍攝屏幕截圖?

更新:我嘗試使用Technical Q&A QA1703: Screen Capture in UIKit Applications中的代碼,這也提出了相同的問題。

UPDATE#2:看起來問題出現在應用了CATransform3D的視圖中。在另一個具有3D子視圖的父視圖中,當截取這個屏幕截圖時,3D效果將從視圖中移除,並且它們顯得平坦(2D)。

+0

隱藏的項目正在顯示,即使alpha爲零?這真的很奇怪。 –

+0

這些是什麼意見?我只是對一些'alpha'設置爲'0'的'UIViews'進行了簡單的測試。0',它工作得很好(他們隱藏在屏幕截圖中)。 – omz

+0

@omz - 它們是帶有UILabel的UIViews。它們在不同的時間由Core Data動畫,所以它們可能會應用'CATransform'。 –

回答

0

看起來問題不只是它們被隱藏,而是應用了CATransform3D。

的堆棧溢出問題"renderInContext:" and CATransform3D有更多的信息,但要點是:

QCCompositionLayer,CAOpenGLLayer和QTMovieLayer層不會呈現。此外,不使用3D變換的圖層,也不繪製指定backgroundFilters,filters,compositingFilter或蒙版值的圖層。

(來自the CALayer docs)。

如果您的應用程序不會應用商店,你可以使用無證UIGetScreenImage API:

// Define at top of implementation file 
CGImageRef UIGetScreenImage(void); 

... 

- (void)buttonPressed:(UIButton *)button 
{ 
    // Capture screen here... 
    CGImageRef screen = UIGetScreenImage(); 
    UIImage* image = [UIImage imageWithCGImage:screen]; 
    CGImageRelease(screen); 

    // Save the captured image to photo album 
    UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 
} 

(從John Muchow

然而,使用該API將使您的應用程序不會得到批准。

我一直無法找到任何其他解決方法。

1

爲什麼不從其超級視圖中刪除隱藏的視圖。然後它不會出現在屏幕截圖上。

[hiddenView removeFromSuperview]; 

編輯:

如果你不知道什麼是子視圖是隱藏的,你可以檢查它。以下代碼將從視圖中刪除所有隱藏的子視圖並將其添加回來。

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(UIView *subView, NSDictionary *bindings) { 
    return subView.hidden; 
}]; 

NSArray *hiddenViews = [[myView subviews] filteredArrayUsingPredicate: predicate]; 

for (UIView *subView in hiddenViews) { 
    [subView removeFromSuperview]; 
} 

//take your screenshot here 

for (UIView *subView in hiddenViews) { 
    [myView addSubview:subView]; 
} 

EDIT2:由於鄧肯Ç指出,這不會嵌套子視圖工作。你需要一個遞歸的方法。

+0

有幾個原因。主要的兩個是(1)隱藏的項目是我仍然需要的其他項目,這就是爲什麼我沒有刪除它們。 (他們將在稍後顯示。)(2)我的方法,動畫視圖,只是簡單地通過一個視圖來製作動畫。它打算在應用程序中的任何視圖上工作,並且不知道在傳遞視圖上顯示的內容。我不應該爲調用此動畫方法的每個不同視圖編寫自定義代碼。 –

+0

@Aaron查看我的編輯。 – Adam

+0

上面的代碼可能不會保留圖層排序。如果不可見視圖介於可見的其他兩個視圖之間,則不會將其放回正確的位置。另一個問題是它不會處理隱形子視圖。如果頂級子視圖包含隱藏的子視圖或子子視圖,則它們不會被刪除。如果要在視圖層次結構中對所有視圖和子視圖進行全面樹搜索,刪除所有隱藏視圖,然後再將它們放回到其正確的子視圖中,並按正確的順序執行代碼,則代碼必須更加複雜。 –