2016-05-31 2 views
5

Я пытаюсь создать всплывающее окно (UIView) с прозрачным фоном (другое UIView). Все работает отлично для «popup UIView», но я не мог понять, как принести «прозрачный фон UIView» (выше NavigationBar и TabBar).Размещение UIView для покрытия TabBar & NavBar

Сначала я создал UIView в раскадровке и подключен выход:

popupView.center = CGPointMake(CGRectGetMidX(self.view.bounds), tableView.center.y); 
self.view.addSubview(popupView) 
popupView.clipsToBounds = true 
popupView.alpha = 0 

Затем, во время отображения popupView Я создаю прозрачный фон 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) 
} 

Однако фон вид Безразлично не переходите на NavigationBar или TabBar. Я попытался это, но ничего не меняется:

myTabBar.view.bringSubviewToFront(opaqueView) 

То, что я хочу добиться того, что, в то время как имеющие popup UIView на самом фронте, имея opaque UIView над всем, включая NavBar и TabBar, но за popup UIView


Обновление:

Что касается ответа @ Alex, с этим куском мне удалось отобразить opaqueView по TabBar & NavBa р; но теперь он также выходит за пределы 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) 
} 

Как разместить opaqueView под popupView, а opaqueView - над всем остальным?

ответ

5

Попробуйте это:

UIApplication.sharedApplication().keyWindow!.bringSubviewToFront(opaqueView) 
+0

Я тоже это пробовал, он привносит opaqueView поверх popupView (чего я не хочу), и не переносит NavBar и TabBar. К сожалению, ваш ответ не помогает:/ – senty

+1

Чтобы заставить его работать, вы должны добавить свой opaqueView следующим образом: UIApplication.sharedApplication(). KeyWindow! .addSubview (opaqueView); Тогда непрозрачный вид будет в верхней части ваших подзонов. Вы не можете добавить его в свой вид (self.view.addSubview (opaqueView)) и дождаться отображения его на панели навигации и панели вкладок. Одним из других решений является добавление его в tabbarController.view или navigationController.view. –

+0

Работает как шарм. Большое спасибо. Но у меня есть вопрос. Когда я использую 'UIApplication.sharedApplication(). KeyWindow! .addSubview (opaqueView);' opaqueView перебирает popUpView. Я попытался использовать 'opaqueView.bringSubviewToFront (popupView)', но ничего не меняет. Как я могу принести «popUpView» над «opaqueView»? – senty

1
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 

       } 
      } 

preview of the result

+0

Эй, Хакман, это отличный ответ! Как вы сможете применить UITapGesture к прозрачному блоку, чтобы отклонить представление, точно так же, как кнопка OK, но вместо этого UITapGesture. Большое вам спасибо за ваш ответ – juelizabeth

+1

Эй, @juelizabeth, хороший вопрос. Чтобы получить доступ к прозрачному виду, создайте UITapGestureRecognizer и добавьте его в метод addButtonTapped. Просто добавьте эти две строки в addButtonTapped 'let tap = UITapGestureRecognizer (target: self, action: #selector (FirstViewController.handleOKButtonTapped (_ :))) self.transparentBackground.addGestureRecognizer (tap)' – Hackman

+0

Большое спасибо, это действительно помог – juelizabeth

0

мнение, которое вы хотите сделать прозрачным, используйте этот

yourView.backgroundColor = UIColor.black.withAlphaComponent (0.7)

Смежные вопросы