web-dev-qa-db-ja.com

プログラムで作成したスクリーンショットがiOS 7で見た目が悪いのはなぜですか?

Facebookで共有アプリを実装しようとしています。このコードを使用してスクリーンショットを撮りました。

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:スクリーンショットをプログラムで作成するための最も高速で最もパフォーマンスの高い方法は何ですか? 修正しようとして、それは助けましたが、それでもスクリーンショットは悪く見えます。画面は別の色になり、一部のオブジェクト(ラベルなど)は撮影した画像に表示されません。助けがありますか?

- - 更新 - -

私はほとんどのオブジェクトを、弱いものではなく保持するように変更することで解決しました。私の主な問題はテーブルビューであり、大きな白いブロックとして表示されていました(白いテキストのラベルが付いた透明なはずなので、白いセルしか見えません)。テーブルの背景をclearcolorとして定義しようとしましたが、助けにはなりません。

- - 最後の更新 - -

ここには本当に私の問題に関するものではない素晴らしい答えがあります。この時点でプロジェクトSDKを切り替えるのに多大な労力がかかるため、iOS7で動作するがiOS7 SDKを使用しないデバイスで動作させたいと思いましたほぼ完了です。

とにかく、最終的に私の問題を解決したコードの平和を追加しました:

この変更により、単に問題が解決されます。

UIGraphicsBeginImageContextWithOptions(imageSize, NO , 0.0f);

の代わりに:

UIGraphicsBeginImageContext(imageSize);
29
Yossi

新しい [〜#〜] api [〜#〜] がiOS 7から追加され、スナップショットを取得する効率的な方法が提供されるはずです。

  • snapshotViewAfterScreenUpdates:は、変更不可能なcontentでビューをUIViewにレンダリングします

  • resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets:同じことですが、サイズ変更可能なインセットがあります

  • drawViewHierarchyInRect:afterScreenUpdates::すべてのサブビューも描画する必要がある場合も同じです(ラベル、ボタンなど)。

UIエフェクトに返されるUIViewを使用するか、エクスポートする必要がある場合と同じように画像にレンダリングできます。

この新しいメソッドがあなたが提供したものに対してVSがどれほど優れているかはわかりません(Appleエンジニアはこの新しいAPIがより効率的だったと言っていますが)

55
Vinzzz

これを試すことができます

- (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;
}
30
user1526474

iOS 8の場合:これがScreenShotを取得する方法です

  1. 。hファイルでスクリーンショットを撮るために1つのUIImageViewとメソッドを追加しました

@property(弱い、非アトミック)IBOutlet UIImageView * imageView;

 -(IBAction)takeSnapShot:(id)sender;

2スクリーンショットを撮影し、UIImageViewに設定するためのコードスニペットを追加。mファイル内

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

    imageView.image = snapShotImage;
}
  1. 以下は私が得た出力です。

enter image description here

6
swiftBoy

IOS7では、使用するとグリッチが発生する可能性があります

[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]

進行中のアニメーション中。 afterScreenUpdates = NOを設定してグリッチを取り除きます。

5
ancajic

opaqueNOに設定されていることを確認してください