Swift iOS -SplitViewController不会让我隐藏StatusBar?

时间:2017-09-17 19:10:41

标签: ios swift uisplitviewcontroller statusbar master-detail

我按照本教程顺利隐藏了statusBar smoothly hide statusBar,当我在练习项目中使用它时一切正常。我使用其他项目中的代码,这些代码没有SplitVC,但有一个tabBar,并使用navVC& tableView,一切正常。在那些我可以成功地使它出现/消失。

在我的实际项目中,我正在使用适用于iPad的SplitViewController。我注意到当我实现从链接到我的SplitViewController的方向时,statusBar不会隐藏。然后,我使用Apple的默认MasterDetailApp创建了一个新项目,以确保我没有做错任何事情,但它也无法正常工作。我保留了Apple的所有原始代码,并且只添加了使statusBar出现/消失的必要方法

    info.plist
  1. 我添加了View controller-based status bar appearance并将其设置为YES

  2. 故事板中的
  3. 我在DetailVC中添加了一个紫色按钮以触发statusBar消失。我还在方法中添加了使backBar按钮消失/重新出现

  4. 我添加了所有方法,使statusBar消失/消失到DetailVC场景。

  5. 我在场景中添加了tapGesture以使statusBar和backButton重新出现

  6. enter image description here

    enter image description here

    我单击主场景上的加号按钮,出现日期,点击它以进入DetailVC,按下紫色buttonPressed以隐藏statusBar和backButton但只有backButton被隐藏。我触摸背景,然后再次出现backButton。 statusBar不会移动。

    我保留了Apple项目中的所有原始代码,并在其下方添加了地雷:

    class DetailViewController: UIViewController {
    
        //MARK:-  Apple's code
        @IBOutlet weak var detailDescriptionLabel: UILabel!
    
        func configureView() {
            if let detail = detailItem {
                if let label = detailDescriptionLabel {
                    label.text = detail.description
                }
            }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            configureView()
    
            // make backButton and statusBar reappear when scene is tapped
            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(showBackButtonAndStatusBar))
            view.addGestureRecognizer(tapGesture)
        }
    
        var detailItem: NSDate? {
            didSet {
                configureView()
            }
        }
    
        //MARK:- Outside of the tapGesture in viewDidLoad everything below here is what I added
    
        // bool to determine wether to hide the statusBar or not
        var statusBarShouldBeHidden = false
    
        // api method to allow the staus bar to be hidden
        override var prefersStatusBarHidden: Bool{
            return statusBarShouldBeHidden
        }
    
        // api method to animate status bar appearance/disappearance
        override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation{
            return .slide
        }
    
        @IBAction func buttonTapped(_ sender: UIButton) {
    
            // 1. hide backBar button
            navigationItem.setHidesBackButton(true, animated: false)
    
            // 2. set bool to true
            statusBarShouldBeHidden = true
    
            UIView.animate(withDuration: 0.25){
                // 3. api method to allow the statusBar to disappear
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    
        //called when background is touched and added to tapGesture in viewDidLoad
        @objc func showBackButtonAndStatusBar(){
    
            // 1. set bool to false
            statusBarShouldBeHidden = false
    
            UIView.animate(withDuration: 0.25){
                // 2. bring statusBar back
                self.setNeedsStatusBarAppearanceUpdate()
            }
    
            // 3. bring backButton back
            navigationItem.setHidesBackButton(false, animated: true)
        }
    }
    

    如何让SplitViewVC让我隐藏statusBar?

1 个答案:

答案 0 :(得分:4)

您似乎试图通过详细视图控制器隐藏状态栏。用户界面中的状态栏仅由拆分视图控制器控制,因为它位于视图控制器层次结构的顶部。因此,控制状态栏行为的最简单方法是子类UISplitViewController,然后覆盖子类中的prefersStatusBarHidden计算属性。此外,请确保转到故事板并将“标识”检查器中的拆分视图控制器的自定义类字段更改为子类。

---更新答案--- @LanceSamaria好的,我把你的代码放在上面并调整了一些东西。首先,我只添加了按钮动作而不是轻击手势。此外,我注释掉隐藏后退按钮,因为这在UI中很重要,以便能够返回到主视图。无论如何,现在当您单击按钮时,SplitViewController将隐藏状态栏。如果再次单击该按钮,则状态栏将重新出现。

导入UIKit

class DetailViewController:UIViewController {

@IBOutlet weak var detailDescriptionLabel: UILabel!

var statusBarShouldBeHidden = false

func configureView() {
    // Update the user interface for the detail item.
    if let detail = self.detailItem {
        if let label = self.detailDescriptionLabel {
            label.text = detail.description
        }
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.configureView()
}

/* override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation{
    return .slide
} */


var detailItem: NSDate? {
    didSet {
        // Update the view.
        self.configureView()
    }
}

@IBAction func buttonTapped(_ sender: UIButton) {
    // 1. hide backBar button
    //navigationItem.setHidesBackButton(true, animated: false)

    // 2. set bool to true
    statusBarShouldBeHidden = !statusBarShouldBeHidden

    UIView.animate(withDuration: 0.25){
        // 3. api method to allow the statusBar to disappear
        guard let svc = self.splitViewController as? SplitViewController else { return }
        svc.statusBarShouldBeHidden = self.statusBarShouldBeHidden
        svc.setNeedsStatusBarAppearanceUpdate()
    }
}

}

另外,还有一件非常重要的事情。下面是我的拆分视图控制器子类的代码。请注意,我在拆分视图控制器和详细控制器中使用相同的变量名称“statusBarShouldBeHidden”。

导入UIKit

类SplitViewController:UISplitViewController {

var statusBarShouldBeHidden = false

override func viewDidLoad() {
    super.viewDidLoad()
}

override var prefersStatusBarHidden: Bool {
    return statusBarShouldBeHidden
}

}

感谢您发布此问题。这有助于我学到很多东西来解决这个问题。如果您对此有疑问,请告诉我。