ナビゲーションバーの上にも、他のビューの上に、次のような一種の「ポップアップ」ビューを表示します。
UIViewController
を下に見るには、0.5アルファのフルスクリーン黒背景。UIView
ウィンドウに情報がいくつかあります(すべてを知りたい場合はカレンダー)。そのために、2つのUIViews
(背景とウィンドウ)を含むUIViewControllerを作成し、それを表示しようとしています。私は簡単な[mySuperVC addSubview:myPopUpVC.view]
を試しましたが、上のナビゲーションバーがまだあります。
これをモーダルとして表示しようとしましたが、下のUIViewController
が消え、透明効果がなくなりました。
これを行うための任意のアイデアは、私はそれが非常に簡単だと確信しています...
ありがとうございます。
あなたはそれを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)
[self.navigationController.view addSubview:overlayView];
はあなたが本当に欲しいものです
これは私のために働いているシンプルでエレガントな解決策です。ナビゲーションバーのz位置をビューの下に設定できます。
self.navigationController.navigationBar.layer.zPosition = -1;
完了したら0に戻すことを忘れないでください。
チェックされた応答のための速い版:
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)
NavigationControllerのサブビューとしてビューを追加します。
[self.navigationController.navigationBar addSubview: overlayView)]
ウィンドウに追加することもできます。
UIView *view = /* Your custom view */;
UIWindow *window = [UIApplication sharedApplication].keyWindow;
[window addSubview:view];
お役に立てれば.. :)
SwiftでのDalefのすばらしい解決策:
self.navigationController?.view.addSubview(view)
@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
}
元の答えはウィンドウの即時割り当て解除につながるので、ウィンドウは強力なプロパティでなければならないことを忘れないでください
それには複数の方法があります。
1- UIView
に追加する代わりに、UIWindow
をUIViewController
に追加します。このようにそれはすべての上にあるでしょう。
[[(AppDelegate *)[UIApplication sharedApplication].delegate window] addSubview:view];
2- 0.5アルファであなたのUIViewControllerを後ろに見せ続けるカスタムトランジションを使います
そのために、私はあなたがこれを見ることを勧めます: https://github.com/Citrrus/BlurryModalSegue
新しい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;
それが役立つことを願っています!
カスタムビューを表示するだけの場合、@ Namの回答は非常に役立ちますが、カスタムビューでユーザー操作が必要な場合は、navigationBar
name __の操作を無効にする必要があります。
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()
[[UIApplication sharedApplication].windows.lastObject addSubview:myView];
UIApplication.shared.keyWindow?.insertSubview(yourView, at: 1)
このメソッドはxcode 9.4、iOS 11.4で動作します
フルスクリーンでビューを追加したい場合は、以下のコードのみを使用してください
これらを追加拡張子 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()
}
他のView Controllerを埋め込む「Container View」を含むUIViewControllerサブクラスを使用します。これで、コンテナビュー内にナビゲーションコントローラを追加できるようになります(たとえば、埋め込み関係セグエを使用)。
Container View Controllerの実装 を参照してください。
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横モードのいずれかでのみ機能します。
[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];