2012-03-02 71 views
4

我有一個視圖,它內部有多個視圖,還有一個圖像演示文件(也稱爲'cover flow')...我需要以編程方式製作屏幕截圖!「renderInContext:」和CATransform3D

由於文檔說,「renderInContext:」不會渲染3D動畫:

「重要的的Mac OS X v10.5的此方法的實現不支持整個Core Animation的組合模型QCCompositionLayer,CAOpenGLLayer和QTMovieLayer圖層不會被渲染,另外,不會渲染使用3D變換的圖層,也不會渲染backgroundFilters,filters,compositingFilter或mask值的圖層。未來版本的Mac OS X可能會增加對渲染這些圖層和屬性的支持。

來源:https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CALayer_class/Introduction/Introduction.html

我尋覓了很多,我的「最好」的解決方案(即都不好),是創造我自己的CGContext上和所有的CG動畫錄製進去。但我真的不想這樣做,因爲我需要重寫大部分動畫代碼,並且這對內存來說會非常昂貴......我發現其他解決方案(其中一些無法制作)使用openGL或通過捕獲AVSessions,但沒有人能幫助我...

我的選擇是什麼?有這個問題嗎?

謝謝你的時間!

回答

0

我得到了它的協議工作。 ...我正在實現一個協議,在所有UIViews類中進行3D變換。所以當我請求一個截圖的時候,它會讓所有的子視圖截圖,並生成一個UIImage。對於很多視圖來說都不是那麼好,但是我在一些視圖中做了。

#pragma mark - Protocol implementation 'TDITransitionCustomTransform' 

//Conforms to "TDITransitionCustomTransform" protocol, return currrent image view state , by current layer 

- (UIImage*)imageForCurrentState { 

//Make print 

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0); 

[self.layer renderInContext:UIGraphicsGetCurrentContext()]; 

UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

//return printed image 

return screenShot; 

} 

我現在想,可能是因爲工作我做在轉化視圖層,已被改造它的自我...... 用於呈現,這是不工作,因爲「renderInContext:」沒有按」 t得到它的子視圖層,可能嗎?

任何興趣在這個解決方案的更多代碼,可以找到here。在蘋果開發論壇。

它可能是一個功能的bug,或者它只是沒有被設計用於此目的...

+0

也許它也工作,如果你使用我以前的功能,但在主UIWindow上使用它,那麼它應該會自動擁有所有視圖裏面。但無論如何,你已經解決了它:) – 2012-03-29 07:43:34

0

你真的試過了嗎?我目前工作的一個項目幾個3D變換,當我試圖以編程方式使這個截圖它工作得很好:) 這裏是我使用的代碼:

-(UIImage *)getScreenshot 
{ 
    CGFloat scale = 1.0; 
    if([[UIScreen mainScreen]respondsToSelector:@selector(scale)]) 
    {   
     CGFloat tmp = [[UIScreen mainScreen]scale]; 
     if (tmp > 1.5) 
     { 
      scale = 2.0;  
     } 
    }  
    if(scale > 1.5) 
    { 
     UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, scale); 
    } 
    else 
    { 
     UIGraphicsBeginImageContext(self.frame.size); 
    }  
    //SELF HERE IS A UIVIEW 
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];  
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return screenshot; 
} 
+0

您正在使用哪種轉換? – 2012-03-21 15:56:10

+0

是的,我試過了!真正的問題在於,轉換後的視圖是我用來渲染屏幕截圖的視圖。 – gwdp 2012-03-28 06:08:50

0

可能是你可以使用核心Graphaic代替CATransform3DMakeRotation :)

CGAffineTransform flip = CGAffineTransformMakeScale(1.0, -1.0); 

其中獲得effet上renderInContext