web-dev-qa-db-ja.com

iOS8でのsnapshotViewAfterScreenUpdatesの不具合

これを実行すると、iPhone5レイアウトからスケーリングされたiPhone6/6 +シミュレーターで実行すると、ビュー(またはメインウィンドウ、不明)のサイズが一時的に変更されることに気付きました(iPhone 6/6 +の起動イメージを渡さずに):

[self.view snapshotViewAfterScreenUpdates:YES];

そこに「NO」を渡せないときにそれを機能させる方法はありますか?

更新(7月13日):
iOS8.4では再現されなくなったようです。

21
Dannie P

Apple/APIの問題のようだったので、「YES」を渡す必要があるときにそのメソッドを使用しないことにしました。

ビューのスクリーンショット(UIImage)を取得し、それをUIImageViewに配置して、スナップショットメソッドから取得するために使用した「UIView」として機能させることができます。

コードへのリンクは次のとおりです。 Retinaディスプレイの品質を損なうことなくUIViewをUIImageにキャプチャする方法

#import <QuartzCore/QuartzCore.h>

+ (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}
13
kgaidis

私はちょうどこの問題を抱えていました。

その理由は、iPhone6にも6plusにも適したローンチ画像がなかったからです。この存在しない画像のために私が見た別の問題は、次のように画面サイズの境界を尋ねたときにiPhone5のサイズを取得したことでした。

CGSize screenSize = [[UIScreen mainScreen] bounds].size;

これらの画像を修正すると、この問題は修正されました。

追伸-起動イメージにアセットカタログとnibファイルのどちらを使用しても機能するはずです。アセットカタログで、iOS 8以降では右側(属性インスペクター)に「V」を追加し、「Retina HD 5.5」の画像を設定する必要があります'(6 plusの場合)および'Retina HD 4.7 '(iPhone 6の場合)

3
oren

@anonと@PJCは正しいようで、それはUIKitのバグです。 [view.layer renderInContext:UIGraphicsGetCurrentContext()]で回避できる場合があります

この時点で、iPhone 6/6 +のレイアウトを手動で調整することで問題を解決しました。ネイティブデバイスの解像度では、問題は再現されないためです。

1
Dannie P