1

UIVisualEffectView が表示されたときに奇妙なアーティファクトを引き起こしています。UIVisualEffectView は、iOS 7 では使用できないため、ビューの読み込み後にコードに追加されます。

ストリートビュー画像の上にぼやけたテキストの背景を見てください: http://s.swic.name/Z3UL

ぼかしが表示されるまでに 0.1 秒かかります。それ以前は、ぼかしがまだ計算されていないように、低解像度の背景が透けて見えます。

何が起こっているのですか?このコードを使用して awakeFromNib にぼかしを追加しています

- (void)addBlurWithColor:(UIColor *)color andStyle:(UIBlurEffectStyle)style andVibrancy:(BOOL)vibrancy
{
    if (UIDevice.supportsVisualEffects && NSClassFromString(@"UIVisualEffectView") && !UIAccessibilityIsReduceTransparencyEnabled()) {
        self.backgroundColor = color;

        UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:style];
        UIVisualEffectView *visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
        visualEffectView.frame = self.bounds;
        visualEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

        NSArray *subviews = self.subviews;

        [self addSubview:visualEffectView];
        [self sendSubviewToBack:visualEffectView];

        if (vibrancy) {
            UIVibrancyEffect *vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect];
            UIVisualEffectView *vibrancyEffectView = [[UIVisualEffectView alloc] initWithEffect:vibrancyEffect];
            [vibrancyEffectView setFrame:self.bounds];
            vibrancyEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

            for (UIView *subview in subviews) {
                [vibrancyEffectView.contentView addSubview:subview];
            }

            [[visualEffectView contentView] addSubview:vibrancyEffectView];
        }
    }
}

編集: ビデオではスロー アニメーションが有効になっているだけで、トランジションは通常のプッシュ セグエです。

Edit2:Interface Builderで「UIVisualEffectView with Blur」をドラッグドロップすると、同じ奇妙な動作が発生するため、上記のコードが原因ではありません。

4

1 に答える 1

2

問題が見つかりました。ビューが表示されたら、内部のテーブルビューをリロードしています[UIView transitionWithView:...]。これにより、アルファが変更されUIVisualEffectViewsます。

UIVisualEffectView ドキ​​ュメントによると;

UIVisualEffectView クラスを使用する場合は、1 未満のアルファ値を避けてください。部分的に透明なビューを作成すると、システムはオフスクリーン レンダー パス中にビューと関連するすべてのサブビューを結合します。UIVisualEffectView オブジェクトは、正しく表示するために、上に重ねるコンテンツの一部として組み合わせる必要があります。視覚効果ビューまたはそのいずれかのスーパービューでアルファを 1 未満に設定すると、多くの効果が正しく表示されなかったり、まったく表示されなかったりします。

https://developer.apple.com/library/ios/documentation/uikit/reference/UIVisualEffectView/index.html

于 2014-12-22T16:29:40.677 に答える