11

ユーザーがデバイスを回転させたときに、あるUIViewから別のUIViewに移行しようとしています。これ自体は難しくありません。ただし、回転後にまったく異なるコンテンツを表示しているため、UIKitが提供するデフォルトのアニメーション(現在表示されているビューを回転させる)は概念的に不適切です。

アニメーションを無効にしてビューを突然入れ替えるだけでも許容できますが、アプリの残りの部分に組み込んでいる洗練度をはるかに下回っています。私がしたいのはこれです:

shouldAutorotateToInterfaceOrientation:が呼び出されたときに、回転前のユーザービューの不透明なビューのスナップショット(必要に応じてスクリーンショット)を取得したいと思います。次に、回転が完了し、システムがビュー変換などを適用した後、保存したスナップショットビューを表示し、選択した遷移を新しいビューにアニメーション化できます。完了したら、スナップショットを解放して次に進むことができます。

高価ではないこれを行う方法はありますか?

私が考えることができる他の唯一のオプションは、デフォルト以外のすべての方向でNOを返し、次に独自のアニメーションと変換を適用して反応することです。システムを使用してこれを実行することをお勧めしますが、自分で実行すると、手動で回転したビューなどで「未定義」のキーボード動作が発生する可能性があると考えています。

考え?

4

4 に答える 4

21
- (UIImage *)captureView:(UIView *)view {
    CGRect screenRect = [[UIScreen mainScreen] bounds];

    UIGraphicsBeginImageContext(screenRect.size);

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [[UIColor blackColor] set];
    CGContextFillRect(ctx, screenRect);

    [view.layer renderInContext:ctx];

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return newImage;
}

ここでこれを見つけました:

http://discussions.apple.com/thread.jspa?messageID=8358740

于 2009-11-22T09:42:12.513 に答える
12

このコードは私のために働いた

- (UIImage *)captureScreenInRect:(CGRect)captureFrame {
    CALayer *layer;
    layer = self.view.layer;
    UIGraphicsBeginImageContext(self.view.bounds.size); 
    CGContextClipToRect (UIGraphicsGetCurrentContext(),captureFrame);
    [layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return screenImage;
}
于 2011-08-16T17:59:09.280 に答える
4

Mac ではこれはとても簡単です...必要なのは だけです-bitmapImageRepForCachingDisplayInRect:が、もちろん iPhone にはそのようなものはありません。

[window drawRect:...]グラフィック コンテキストを設定し、それを呼び出して現在の画面イメージをキャプチャすることで、これを攻撃すると思います。これは少し仕様から外れています。実際に自分自身を呼び出すことは想定されていないためです-drawRect:。これを行うと副作用が少し心配になりますが、大丈夫かもしれません。制御する全画面表示の場合は、もちろん描画コードを巻き上げて、-drawRect:それを直接呼び出さないようにすることができます。

同様のアプローチはCALayer -drawInContext:、 currentを使用すること-presentationLayerです。独自のコンテキストを渡すことは合法であるため、これはもう少し「仕様上」である可能性があります。しかし、実際にすべてのサブビューを正しく取得できるかどうかはわかりません。UIWindow の性質に依存する場合があります。

とにかく、素晴らしい質問です。誰かがもっと賢い解決策を持っているかもしれませんが、これが私が攻撃する方法です。

編集: Rob Terrell と彼の巧妙なUIApplication+TVOut.mのおかげで、CGImageRef を返すプライベート メソッド UIGetScreenImage() を紹介されました。プライベート メソッドを使用する場合は、それが最適なオプションです。その名前と機能を考えると、私にはかなり安定しているように見え、Apple の意図に反する可能性は低いと思われます。また、 Air Sourceに関する非常に優れたディスカッションにも出くわしました。いくつかのリンクのコメントを読んでください。

于 2009-05-18T18:31:29.190 に答える