web-dev-qa-db-ja.com

とりわけナビゲーションバーでさえもUIViewを追加する

ナビゲーションバーの上にも、他のビューの上に、次のような一種の「ポップアップ」ビューを表示します。

  • 他のUIViewControllerを下に見るには、0.5アルファのフルスクリーン黒背景。
  • 中央のUIViewウィンドウに情報がいくつかあります(すべてを知りたい場合はカレンダー)。

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

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

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

ありがとうございます。

166
Nicolas Roy

あなたはそれをkeyWindowに直接追加することでそれを行うことができます:

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

アップデート - Swift 4.1以降の場合

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

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

124
dalef

これは私のために働いているシンプルでエレガントな解決策です。ナビゲーションバーのz位置をビューの下に設定できます。

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

完了したら0に戻すことを忘れないでください。

95
Nam

チェックされた応答のための速い版:

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)
56
Kevin ABRIOUX

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

[self.navigationController.navigationBar addSubview: overlayView)]

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

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

お役に立てれば.. :)

20
Rashad

SwiftでのDalefのすばらしい解決策:

self.navigationController?.view.addSubview(view)
18
Allreadyhome

@Nicolas Bonnetの答えの素早いバージョン:

    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
}

元の答えはウィンドウの即時割り当て解除につながるので、ウィンドウは強力なプロパティでなければならないことを忘れないでください

8
iOS Unit

それには複数の方法があります。

1- UIViewに追加する代わりに、UIWindowUIViewControllerに追加します。このようにそれはすべての上にあるでしょう。

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

2- 0.5アルファであなたのUIViewControllerを後ろに見せ続けるカスタムトランジションを使います

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

6
Dani A

新しい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;

それが役立つことを願っています!

5
Nicolas Bonnet

カスタムビューを表示するだけの場合、@ Namの回答は非常に役立ちますが、カスタムビューでユーザー操作が必要な場合は、navigationBarname __の操作を無効にする必要があります。

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()
5
Hemang
[[UIApplication sharedApplication].windows.lastObject addSubview:myView];
4
jold
UIApplication.shared.keyWindow?.insertSubview(yourView, at: 1)

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

2
Ahmed R.

フルスクリーンでビューを追加したい場合は、以下のコードのみを使用してください

これらを追加拡張子 of IViewController

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
      }
   }
}

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

今すぐ追加に使用してくださいIViewControllerのviewDidAppear

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

     self.makeViewAsFullScreen()
}
2
Paresh Navadiya

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

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

1
dulgan

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!)

In 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];

これは、縦OR横モードのいずれかでのみ機能します。

1
iOS
[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];

enter image description here

0
Fadi Abuzant