2017-09-17 71 views
1

我按照本教程顺利隐藏了状态栏smoothly hide statusBar,当我在练习项目中使用它时,一切正常。我在其他项目中使用的代码没有SplitVC,但有一个TabBar,并使用navView & tableView和一切工作正常。在那些我可以成功地让它出现/消失。Swift iOS -SplitViewController不会让我隐藏StatusBar?

在我的实际项目中,我使用了iPad的SplitViewController。我注意到,当我将链接指向SplitViewController时,statusBar不会隐藏。然后,我使用Apple的默认MasterDetailApp创建了一个新项目,以确保我没有做错任何事情,但它在那里也不起作用。我保存了所有的苹果公司的原代码,只在必要的方法加入使状态栏出现/消失

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

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

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

  4. 我添加了一个tapGesture到现场,使状态栏和后退按钮重新出现

enter image description here

enter image description here

我点击主场景的加号按钮,日期出现了,点击它来到DetailVC,按下紫色buttonPressed来隐藏statusBar和backButton,但只有backButton被隐藏。我触摸背景和backButton重新出现。 statusBar不会移动。

我保持全部原代码从苹果公司的项目,并添加它下面的地雷:

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让我隐藏状态栏?

+0

有趣,但设置应用程序(本地)可以隐藏它,所以我们也可以。 – Jageen

+0

你解决了这个问题吗? – Jageen

+0

@Jageen我真的厌倦了它,只是决定保持状态栏。 SplitViewController必须成为我iOS时代所有令人头疼的问题。我对自己说,也许我必须在SplitViewController本身上进行更改,但问题在于它会将应用程序范围应用于连接到splitVC的每个子vc。这就是当我说“嗯,忘记它” –

回答

4

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

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

进口的UIKit

类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 
} 

}

谢谢你张贴了这个问题。这帮助我学会了很多尝试解决这个问题。如果您仍然对此有疑问,请告诉我。

+1

感谢您的答案。我曾经考虑过你提出的建议,但后来我意识到每个连接到splitVC的vc都会删除我不想要的状态栏。之后我投入了毛巾并决定保持状态栏。 SplitVC是一个令人头疼的问题。我已经把所有东西都分类并连接了。在我完成所有这些我一直遇到的其他错误后,我会回到它。我会upvote你,因为我认为你的答案是正确的,只要有人希望每个孩子vc去除状态栏 –

+0

@LanceSamaria嗨,我不知道堆栈溢出是否会通知你我的更新答案, m评论你让你知道。 –

+0

我查看了你的答案,并且你有必要在顶部视图控制器中更改它。我有一个孩子VC,是隐藏状态栏的唯一方法是隐藏它的父vc(navVC)。我会接受你的答案作为接受的答案!谢谢 –