Reputation: 12847
I am trying to make a popup (UIView
) with a transparent background (another UIView
). Everything is working fine for the 'popup UIView
' but I couldn't figure out how to bring 'transparent background UIView
' (above NavigationBar and TabBar).
First I created the UIView in the Storyboard and connected the outlet:
popupView.center = CGPointMake(CGRectGetMidX(self.view.bounds), tableView.center.y);
self.view.addSubview(popupView)
popupView.clipsToBounds = true
popupView.alpha = 0
Then, while displaying popupView
I am creating the transparent background UIView:
func clicked() {
self.popupView.alpha = 1
let screenSize: CGRect = UIScreen.mainScreen().bounds
let opaqueView = UIView()
opaqueView.frame.size = CGSize(width: screenSize.width, height: screenSize.height)
opaqueView.backgroundColor = UIColor.blackColor()
opaqueView.alpha = 0.5
self.view.addSubview(opaqueView)
}
However, the background view doesn't get over NavigationBar or TabBar. I tried this but nothing changes:
myTabBar.view.bringSubviewToFront(opaqueView)
What I want to achieve is that, while having popup UIView
at the very front, having opaque UIView
over everything including NavBar and TabBar, but behind popup UIView
Update:
Regarding @Alex's answer, with this chunk, I achieved displaying opaqueView
over TabBar & NavBar; but now it's also going above the popupView.
func display() {
popupView.center = CGPointMake(CGRectGetMidX(self.view.bounds), tableView.center.y);
self.view.addSubview(popupView)
popupView.clipsToBounds = true
let opaqueView = UIView()
let screenSize: CGRect = UIScreen.mainScreen().bounds
opaqueView.frame.size = CGSize(width: screenSize.width, height: screenSize.height)
UIApplication.sharedApplication().keyWindow!.insertSubview(opaqueView, belowSubview: popupView)
}
How can I place opaqueView below popupView while opaqueView is above everything else?
Upvotes: 17
Views: 14230
Reputation: 2176
Try this:
UIApplication.sharedApplication().keyWindow!.bringSubviewToFront(opaqueView)
Updating for Swift 4.2
UIApplication.shared.keyWindow!.bringSubview(toFront: opaqueView!)
Updating for Swift 5
UIApplication.shared.keyWindow!.bringSubviewToFront(opaqueView!)
Upvotes: 14
Reputation: 477
UIApplication.shared.keyWindow!.bringSubviewToFront(view: view) was depreciated after iOS 13. The best way to have your transparent view cover both the tab controller and nav controller is by doing this.
if let tabBarController = self.tabBarController {
tabBarController.view.addSubview(view)
}
Upvotes: 8
Reputation: 2357
(swift 3+) This will make your view on top of tab bar and navigation bar
UIApplication.shared.keyWindow!.addSubview(yourView)
UIApplication.shared.keyWindow!.bringSubview(toFront: yourView)
Upvotes: 6
Reputation: 157
The view which you want to do transparent, use this
yourView.backgroundColor = UIColor.black.withAlphaComponent(0.7)
Upvotes: -2
Reputation: 2659
func addButtonTapped(){
if self.transparentBackground == nil{
self.transparentBackground = UIView(frame: UIScreen.main.bounds)
self.transparentBackground.backgroundColor = UIColor(white: 0.0, alpha: 0.54)
UIApplication.shared.keyWindow!.addSubview(self.transparentBackground)
self.opaqueView = self.setupOpaqueView()
self.transparentBackground.addSubview(opaqueView)
UIApplication.shared.keyWindow!.bringSubview(toFront: self.transparentBackground)
self.view.bringSubview(toFront: transparentBackground)
}
}
func setupOpaqueView() -> UIView{
let mainView = UIView(frame: CGRect(x: 16, y: 100, width: Int(UIScreen.main.bounds.width-32), height: 200))
mainView.backgroundColor = UIColor.white
let titleLabel = UILabel(frame: CGRect(x: 16, y: 20, width: Int(mainView.frame.width-32), height: 100))
titleLabel.text = "This is the opaque"
titleLabel.textAlignment = .center
titleLabel.font = font
titleLabel.textColor = UIColor(white: 0.0, alpha: 0.54)
mainView.addSubview(titleLabel)
let OKbutton = UIButton(frame: CGRect(x: 16, y: Int(mainView.frame.height-60), width: Int(mainView.frame.width-32), height: 45))
OKbutton.backgroundColor = UIColor(red: 40.0 / 255.0, green: 187.0 / 255.0, blue: 187.0 / 255.0, alpha: 1)
OKbutton.layer.cornerRadius = 10
mainView.addSubview(OKbutton)
OKbutton.setTitle("OK", for: .normal)
OKbutton.setTitleColor(UIColor.white, for: .normal)
OKbutton.titleLabel?.font = font
OKbutton.addTarget(self, action: #selector(FirstViewController.handleOKButtonTapped(_:)), for: .touchUpInside)
return mainView
}
func handleOKButtonTapped(_ sender: UIButton){
UIView.animate(withDuration: 0.3, animations: {
self.transparentBackground.alpha = 0
}) { done in
self.transparentBackground.removeFromSuperview()
self.transparentBackground = nil
}
}
Upvotes: 5