1. ホーム
  2. ios

iOS 7 半透明のモーダルビューコントローラー

2023-08-04 14:54:28

質問

iOS 7 の App Store アプリでは、後ろの景色が見えるすりガラスタイプのエフェクトを使用しています。これは、iOS 7 に組み込まれた API を使用しているのか、それともカスタム コードなのでしょうか。前者であることを期待していましたが、ドキュメントに明らかな参照は見当たりません。モーダル ビューにアルファ プロパティを設定するような)明白なことは、何の効果もないようです。

例を見るには、App Store アプリを開き、右上のボタンを押します。

どのように解決するのですか?

iOS 8.0のリリースにより、画像を取得してぼかすという作業が不要になりました。というのも アンドリュー・プラマー が指摘しているように UIVisualEffectView UIBlurEffect .

UIViewController * contributeViewController = [[UIViewController alloc] init];
UIBlurEffect * blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
UIVisualEffectView *beView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
beView.frame = self.view.bounds;

contributeViewController.view.frame = self.view.bounds;
contributeViewController.view.backgroundColor = [UIColor clearColor];
[contributeViewController.view insertSubview:beView atIndex:0];
contributeViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[self presentViewController:contributeViewController animated:YES completion:nil];


iOS 8以前で動作するソリューション

rckoenesさんの回答に補足します。

強調されているように、次のようにしてこの効果を生み出すことができます。

  1. 基礎となる UIView を UIImage に変換する。
  2. UIImage をぼかす
  3. UIImageをビューの背景として設定する。


多くの作業のように聞こえますが、実際にはかなり単純に行われます。

1. UIViewのカテゴリを作成し、以下のメソッドを追加します。

-(UIImage *)convertViewToImage
{
    UIGraphicsBeginImageContext(self.bounds.size);
    [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

2. 現在のビューの画像を作り、それをぼかすために アップルの「画像効果」カテゴリ ( ダウンロード )

UIImage* imageOfUnderlyingView = [self.view convertViewToImage];
imageOfUnderlyingView = [imageOfUnderlyingView applyBlurWithRadius:20
                             tintColor:[UIColor colorWithWhite:1.0 alpha:0.2]
                 saturationDeltaFactor:1.3
                             maskImage:nil];

3. オーバーレイの背景として設定します。

-(void)viewDidLoad
{
   self.view.backgroundColor = [UIColor clearColor];
   UIImageView* backView = [[UIImageView alloc] initWithFrame:self.view.frame];
   backView.image = imageOfUnderlyingView;
   backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
   [self.view addSubview:backView];
}