何よりもUIViewを追加します。ナビゲーションバーも追加します


181

他のビューの上に、ナビゲーションバーも含めて、次のような「ポップアップ」ビューを表示したいと思います。

  • フルスクリーンの黒の背景と0.5のアルファUIViewController
  • UIViewいくつかの情報を中央に窓、(あなたはすべてを知りたい場合は、カレンダー)。

そのために、2つUIViews(背景とウィンドウ)を含むUIViewControllerを作成し、それを表示しようとしています。シンプルなを試しましたが、[mySuperVC addSubview:myPopUpVC.view]まだナビゲーションバーが上にあります。

モーダルとして提示しようとしましたが、UIViewController下が消えて透明効果がなくなりました。

これを行うためのアイデアは、それは非常に簡単だと確信しています...

ありがとう!


アプリケーションウィンドウにサブビューを追加します。向きの変更の処理には注意が必要です。stackoverflow.com/ questions
Amar

回答:


197

これは、keyWindowにビューを直接追加することで実行できます。

UIView *myView = /* <- Your custom view */;
UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
[currentWindow addSubview:myView];

UPDATE-Swift 4.1以降の場合

let currentWindow: UIWindow? = UIApplication.shared.keyWindow
currentWindow?.addSubview(myView)

2
ありがとう:)残念ながら、横向きモードの場合は、ビューを回転させる必要があります。私はそれを適切に行う方法を知っているかわかりません。
Nicolas Roy

はい、横向きモードのみで、myViewが90度回転して表示されます。彼らはおよそここで話している何をしているようだ:stackoverflow.com/questions/8774495/...
ニコラ・ロイ

向きの問題は、iOS8より前のデバイスで発生しますが、このソリューションでは残念ながら機能しません。
thgc 2014

@NicolasRoy Autolayoutが役立ちます
Darmen Amanbayev、2015

4
タブバーはカバーしていません。そのための解決策はありますか?
Manisha 2016

134

[self.navigationController.view addSubview:overlayView]; あなたが本当に欲しいものです


5
フレームを設定する必要があります
ガブリエルゴン

1
特に、ビューを「子ビューコントローラ」として追加する場合の非常に優れたソリューション
Richard Topchii

2
これは、子ビューコントローラーのビューでは機能しません。ナビゲーションバーのZレベルの変更(Namの提案による)は、子ビューコントローラでも機能します。
Tapani 2015年

キーウィンドウにビューを追加するよりもエレガントなソリューションに見えます。これにより、ビューが追加され、ベースビューのアニメーションに沿って移動します。キーウィンドウにビューが追加された場合、アニメーションは付属せず、コントローラーを閉じる場合は別に削除する必要があるためです。
soan saini

それはポップアップではありませんが、私の場合はちょうどいいです。ありがとう))
Dilshod Zopirov

112

ここに私のために働いているシンプルでエレガントなソリューションがあります。ナビゲーションバーのz位置をビューの下に設定できます。

self.navigationController.navigationBar.layer.zPosition = -1;

完了したら、必ず0に戻してください。


1
これは、ナビゲーションコントローラのビューにサブビューとしてオーバーレイビューを追加するよりもはるかに効果的です(ところで、これによりクラッシュが発生します)。このz位置ソリューションは、おそらくはるかに信頼性が高く、将来的に問題が少なくなります。
Tapani 2015年

これは、ストーリーボードを操作するときに非常に役立ちます。ストーリーボード内にビューを追加できます!
Jos Koomen 2016年

私にとってもうまくいきます。zPositionを値0に戻す必要があることを言及しておくのは素晴らしいことです(完了したら設定し直す必要があると述べただけです)。そして、私はあまりにも私の画面にTabBarControllerからタブバーを(持っている私はZPOSITIONを設定しようとしましたが、0値に戻ったときにタブバーがまだ見えませんでしたので、タブバーのはisHiddenプロパティを使用することをお勧めします。。。
リボルZapletal

1
アクセシビリティを操作しないでください。ビューをパンしてもフォーカスされません。
antonjn

わたしは、あなたを愛しています!!<3
chr0x

57

チェックされた応答のSwiftバージョン:

Swift 4:

let view = UIView()
view.frame = UIApplication.shared.keyWindow!.frame
UIApplication.shared.keyWindow!.addSubview(view)

Swift 3.1:

let view = UIView()
view.frame = UIApplication.sharedApplication().keyWindow!.frame 
UIApplication.sharedApplication().keyWindow!.addSubview(view)

6
これを現在のすべてのビュー(ビューコントローラー)に適用することはできますが、その上に新しいビューコントローラーを表示したままにできますか?
のMichałZiobro

24

ビューをNavigationControllerのサブビューとして追加します。

[self.navigationController.navigationBar addSubview: overlayView)]

ウィンドウから追加することもできます。

UIView *view = /* Your custom view */;
UIWindow *window = [UIApplication sharedApplication].keyWindow;
[window addSubview:view];

お役に立てれば.. :)


オーバービューが来ていますが、ボタンを追加すると、ボタンのアクションを取得できなかったか、overViewにカスタムラベルテキストを設定できませんでした
Vineesh TP

私のために罰金を作品:let navigationBar = viewController.navigationController!.navigationBar navigationBar.addSubview(coverView)
アーサー・クレメンス

22

迅速なダレフの優れたソリューション:

self.navigationController?.view.addSubview(view)

11

@Namの回答は、カスタムビューを表示したいだけの場合はうまく機能しますが、カスタムビューでユーザー操作が必要な場合は、の操作を無効にする必要がありますnavigationBar

self.navigationController.navigationBar.layer.zPosition = -1
self.navigationController.navigationBar.isUserInteractionEnabled = false

ナムの答えで述べたように、これらの変更を元に戻すことを忘れないでください:

self.navigationController.navigationBar.layer.zPosition = 0
self.navigationController.navigationBar.isUserInteractionEnabled = true


あなたは拡張機能でより良い方法でこれを行うことができます:

extension UINavigationBar {
    func toggle() {
        if self.layer.zPosition == -1 {
            self.layer.zPosition = 0
            self.isUserInteractionEnabled = true
        } else {
            self.layer.zPosition = -1
            self.isUserInteractionEnabled = false
        }
    }
}

そして単に次のように使用します:

self.navigationController.navigationBar.toggle()

1
完璧なソリューション.. !! 多くのことを試して、多くの時間を費やしましたが、これはうまくいきます。
ディシャント

8

@Nicolas Bonnetの回答のSwiftバージョン:

    var popupWindow: UIWindow?

func showViewController(controller: UIViewController) {
    self.popupWindow = UIWindow(frame: UIScreen.mainScreen().bounds)
    controller.view.frame = self.popupWindow!.bounds
    self.popupWindow!.rootViewController = controller
    self.popupWindow!.makeKeyAndVisible()
}

func viewControllerDidRemove() {
    self.popupWindow?.removeFromSuperview()
    self.popupWindow = nil
}

ウィンドウが強力なプロパティである必要があることを忘れないでください。元の答えはウィンドウの即時割り当て解除につながるためです。


6

新しいUIWindowを作成することをお勧めします。

UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
window.rootViewController = viewController;
window.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
window.opaque = NO;
window.windowLevel = UIWindowLevelCFShareCircle;
window.backgroundColor = [UIColor clearColor];

[window makeKeyAndVisible];

その後、他のUIViewControllerでビューを管理できます。ウィンドウを削除するには:

[window removeFromSuperview];
window = nil;

お役に立てれば幸いです。


3
ありがとう、でも何も表示されないので何かが足りないと思います:/
Nicolas Roy

6

それを行う方法は複数あります。

1-に追加するのUIViewではUIWindowなく、を追加しますUIViewController。このように、それはすべての上にあります。

   [[(AppDelegate *)[UIApplication sharedApplication].delegate window] addSubview:view];

2- UIViewControllerを0.5アルファで背面に表示し続けるカスタム遷移を使用します

そのため、私はあなたがこれを見るのをお勧めします:https : //github.com/Citrrus/BlurryModalSegue


4
[[UIApplication sharedApplication].windows.lastObject addSubview:myView];

3

Swift 4.2およびXcode 10

var spinnerView: UIView? //This is your view

spinnerView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))
//Based on your requirement change width and height like self.view.bounds.size.width
spinnerView?.backgroundColor = UIColor.black.withAlphaComponent(0.6)
//        self.view.addSubview(spinnerView)
let currentWindow: UIWindow? = UIApplication.shared.keyWindow
currentWindow?.addSubview(spinnerView!)

Objective C

UIView * spinnerView; //これはあなたのビューです

self.spinnerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height)];  
//Based on your requirement change width and height like self.view.bounds.size.width
self.spinnerView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
// [self.view addSubview:self.spinnerView];
UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
[currentWindow addSubview:self.spinnerView];

これは、ポートレートモードまたはランドスケープモードでのみ機能します。

もう1つの単純なコードは次のとおりです。

yourViewName.layer.zPosition = 1//Change you view name

2

全画面でビューを追加したい場合は、以下のコードのみを使用してください

UIViewControllerのこれらの拡張機能を追加します。

public extension UIViewController {
   internal func makeViewAsFullScreen() {
      var viewFrame:CGRect = self.view.frame
      if viewFrame.origin.y > 0 || viewFrame.origin.x > 0 {
        self.view.frame = UIScreen.main.bounds
      }
   }
}

サブビューの通常の追加プロセスとして続行

UIViewControllerのviewDidAppearの追加に使用します

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

     self.makeViewAsFullScreen()
}

1

他のビューコントローラを埋め込む「コンテナビュー」を含むUIViewControllerサブクラスを使用します。その後、コンテナビュー内にナビゲーションコントローラを追加できます(たとえば、埋め込み関係のセグエを使用)。

Container View Controllerの実装を参照してください


1
UIApplication.shared.keyWindow?.insertSubview(yourView, at: 1)

このメソッドは、xcode 9.4、iOS 11.4で動作します


0
[self.navigationController.navigationBar.layer setZPosition:-0.1];
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(10, 20, 35, 35)];
[view setBackgroundColor:[UIColor redColor]];
[self.navigationController.view addSubview:view];
[self.navigationController.view bringSubviewToFront:view];
self.navigationController.view.clipsToBounds = NO;
[self.navigationController.navigationBar.layer setZPosition:0.0];

ここに画像の説明を入力してください


0

UITextEffectsWindowタイプの最初のウィンドウにサブビューを追加する必要があります。第一に、カスタムキーボードはUITextEffectsWindowを追加するため、それにサブビューを追加すると、これは正しく機能しません。また、たとえばキーボードもウィンドウであり、キーボードウィンドウから表示できないため、最後のウィンドウにサブビューを追加することはできません。したがって、私が見つけた最良の解決策は、UITextEffectsWindowタイプの最初のウィンドウにサブビュー(またはビュービューコントローラー)を追加することです。このウィンドウは、アクセサリービュー、ナビゲーションバー、すべてをカバーしています。

let myView = MyView()
myView.frame = UIScreen.main.bounds

guard let textEffectsWindow = NSClassFromString("UITextEffectsWindow") else { return }
let window = UIApplication.shared.windows.first { window in
    window.isKind(of: textEffectsWindow)
}
window?.rootViewController?.view.addSubview(myView)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.