0

私は画像ビューでセルフビューを持っています:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.bounds];
[self setBluredImageView:imageView];        
[self addSubview:imageView];

- (UIImage *)takeSnapshotOfView:(UIView *)view
{
    CGFloat reductionFactor = 1;
    UIGraphicsBeginImageContext(CGSizeMake(view.frame.size.width/reductionFactor, view.frame.size.height/reductionFactor));
    [view drawViewHierarchyInRect:CGRectMake(0, 0, view.frame.size.width/reductionFactor, view.frame.size.height/reductionFactor) afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

他のビューよりも自分のビューを表示したい場合の方法では、次のようにします。

- (void)showMe; {


    AppDelegate* app = [AppDelegate shared];
    [app.window addSubview:self];

    UIImage *image = [self blurWithImageEffects:[self takeSnapshotOfView:app.window]];

    [[self bluredImageView] setImage:image];

    [UIView animateWithDuration:0.4 animations:^{

        [self setAlpha:1.0];

    }];
}

ご覧のとおり、メイン ウィンドウ ビューに基づく「グラフィック コンテキスト」をぼかす必要があります。セルフビューを提示すると、最初は完璧に機能しますが、ぼやけたイメージのようなものが互いに乗算されます。

これは、最初にビューを表示したときの画像です。

ここに画像の説明を入力

ビューを数回表示すると、ぼやけた画像は次のようになります。

ここに画像の説明を入力

ご覧のとおり、ぼやけたスクリーンショットは毎回異なりますが、スクリーンショットを取得するために同じ方法を使用し、View Controller やその他の UI パーツのコンテンツを更新しません。

ここにあるいくつかの方法と画像カテゴリ。

4

1 に答える 1

1

ぼかしのループを作成しました。ビューのスクリーンショットをもう一度撮ると、bluredImageView もスクリーンショットに含まれています。そのため、効果が倍増するのがわかります。それを削除して、効果のないコンテキストのみをキャプチャしてから、再度追加してみてください

 - (UIImage *)takeSnapshotOfView:(UIView *)view
{
    //Remove the blured image before taking another screenshot.
    [self bluredImageView] removeFromSuperview];
    CGFloat reductionFactor = 1;

    UIGraphicsBeginImageContext(CGSizeMake(view.frame.size.width/reductionFactor, view.frame.size.height/reductionFactor));
    [view drawViewHierarchyInRect:CGRectMake(0, 0, view.frame.size.width/reductionFactor, view.frame.size.height/reductionFactor) afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //Add it back now that the effect is done
    [self addSubview:[self bluredImageView];
    return image;
}
于 2015-02-17T21:04:26.750 に答える