4

内部に複数のビューがあるビューがあり、その中に画像プレゼンテーション(別名「カバーフロー」)もあります...そして、プログラムでスクリーンショットを作成する必要があります!

ドキュメントには「renderInContext:」は3Dアニメーションをレンダリングしないと書かれているので:

「重要このメソッドのMacOSX v10.5実装は、Core Animationコンポジションモデル全体をサポートしていません。QCCompositionLayer、CAOpenGLLayer、およびQTMovieLayerレイヤーはレンダリングされません。さらに、3D変換を使用するレイヤーはレンダリングされず、指定するレイヤーもレンダリングされません。 backgroundFilters、filters、compositingFilter、またはマスク値。MacOS Xの将来のバージョンでは、これらのレイヤーとプロパティのレンダリングのサポートが追加される可能性があります。」

ソース:https ://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CALayer_class/Introduction/Introduction.html

私はたくさん検索しましたが、私の「最良の」解決策(それはまったく良くありません)は、独自のCGContextを作成し、それにすべてのCGアニメーションを記録することです。しかし、アニメーションコードのほとんどを書き直す必要があり、メモリに非常にコストがかかるため、実際にはやりたくありません... openGLを使用するか、キャプチャスルーする他のソリューション(一部は作成できません)を見つけましたAVSessionsですが、私を助けることができる人は誰もいません...

私のオプションは何ですか?その問題で何か?

御時間ありがとうございます !

4

3 に答える 3

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;
}
于 2012-03-21T10:18:28.650 に答える
0

UIViewsプロトコルで動作するようになりました。3D変換を行うすべてのクラスにプロトコルを実装しています。したがって、スクリーンショットをリクエストすると、すべてのサブビューのスクリーンショットが作成され、1つの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:」がサブビューのレイヤーを取得しないため、機能していませんでした。それは可能ですか?

このソリューションのもう少しコードに興味がある人は、ここで見つけることができます。アップル開発フォーラムで。

関数のバグであるか、この目的のために設計されていない可能性があります...

于 2012-03-28T05:58:31.957 に答える
0

CATransform3DMakeRotationの代わりにCoreGraphaicを使用できるかもしれません:)

CGAffineTransform flip = CGAffineTransformMakeScale(1.0, -1.0);

これはrenderInContextで効果を発揮します

于 2015-10-29T05:29:04.823 に答える