2014-02-18 31 views
113

我想顯示,上述任何其他意見,即使在導航欄上,一種「彈出」認爲是這樣的:添加一個UIView高於一切,甚至導航欄

  • 全屏用0.5 alpha的黑色背景看下面的其他UIViewController
  • a UIView窗口中間有一些信息,(一個日曆,如果你想知道一切)。

爲此,我創建了一個包含兩個UIViews(背景和窗口)的UIViewController,並試圖顯示它。我嘗試了一個簡單的[mySuperVC addSubview:myPopUpVC.view],但我仍然有上面的導航欄。

我試圖將其作爲模式呈現,但下面的UIViewController消失了,我失去了透明效果。

任何想法做到這一點,我敢肯定這很簡單...

謝謝!

+0

使用添加一個子視圖您的應用程序窗口。處理方向更改可能會很棘手:http://stackoverflow.com/questions/8774495/view-on-top-of-everything-uiwindow-subview-vs-uiviewcontroller-subview – Amar

+1

馬克@達萊夫的答案是正確的答案,如果它的工作爲你。 – djv

回答

146

你可以做,通過直接將您的視圖的keyWindow:

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

謝謝:)不幸的是,如果你處於橫向模式,你需要旋轉視圖。我不確定我知道如何正確地做到這一點。 –

+0

是的,我只處於橫向模式,myView以90度旋轉出現。似乎是他們在這裏談論的內容:http://stackoverflow.com/questions/8774495/view-on-top-of-everything-uiwindow-subview-vs-uiviewcontroller-subview –

+0

方向問題發生在預定義iOS8設備,爲此解決方案可悲的是無法正常工作。 – thgc

5

我建議你創建一個新的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; 

希望能幫到大家!

+2

謝謝,但我認爲缺少一些東西,因爲沒有出現:/ –

18

將您添加爲NavigationController的子視圖。

[self.navigationController.navigationBar addSubview: overlayView)] 

您也可以將其添加在窗口:

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

希望這有助於.. :)

+0

視圖即將到來,但當添加按鈕無法獲得按鈕操作或在overView上設置自定義標籤文本 –

+0

適用於我: 'let navigationBar = viewController.navigationController!.navigationBar navigationBar.addSubview(coverView)' –

+0

@ArthurClemens>很高興知道。 :) – Rashad

97

[self.navigationController.view addSubview:overlayView];是你真正想要的

+3

您需要設置框架 – Gabox

+1

非常好的解決方案,尤其是當您添加視圖作爲「子視圖控制器」 –

+1

這不適用於子視圖控制器的視圖。更改導航欄的z級別(如Nam所示)也適用於子視圖控制器。 – Tapani

6

有不止一種方法要做到這一點:

1-將UIView加入UIWindow而不是將其添加到UIViewController。這樣它就會處於最佳狀態。

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

2-,將讓您的UIViewController顯示有0.5阿爾法

了回來,我建議使用自定義的過渡,你看看這個:https://github.com/Citrrus/BlurryModalSegue

9

Dalef很好的解決方案在迅速:

self.navigationController?.view.addSubview(view) 
71

這是一個簡單優雅的解決方案,爲我工作。您可以在導航欄的Z位置設置爲以下觀點:

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

只記得在完成時將其設置回0。

+1

這比將疊加視圖作爲子視圖添加到導航控制器的視圖(這會導致崩潰)的效果要好得多。這種z位置解決方案可能更可靠,並且未來會導致更少的問題。 – Tapani

+0

使用故事板時,此功能非常棒。您可以在故事板中添加視圖! –

+0

也適合我。很高興提到zPosition應該被設置回0(你只是提到它應該在完成時被設置回去)。我有我的屏幕TabBarController(我也試圖設置zPosition,但是當返回0值tabBar是不可見的。所以對於TabBar最好使用isHidden屬性。 –

1

我會使用一個UIViewController子類包含一個「容器視圖」嵌入你的其他視圖控制器。 然後,您就可以在容器視圖內添加導航控制器(例如,使用嵌入關係segue)。

參見Implementing a Container View Controller

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

爲被檢查的響應夫特版本:

夫特4:

let newView = UIView() 
UIApplication.shared.keyWindow?.addSubview(newView) 

夫特3.1:

let newView = UIView() 
UIApplication.sharedApplication().keyWindow?.addSubview(newView) 
@Nicolas閥蓋的答案
+1

我可以把這個封面全部當前視圖(視圖控制器),但留下新的出現視圖控制器顯示在上面嗎? –

4

斯威夫特版本:

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 
} 

不要忘記,窗口必須是強大的屬性,因爲原來的答覆導致窗口立即釋放

-2
[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

1

注意

添加這些擴展的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() 
}