隐藏状态栏的视图控制器的交互式视图控制器转换

Posted

技术标签:

【中文标题】隐藏状态栏的视图控制器的交互式视图控制器转换【英文标题】:Interactive view controller transition from view controller with status bar hidden 【发布时间】:2015-11-25 01:36:12 【问题描述】:

这是我的demo project。

我有两个视图控制器。第一个隐藏了状态栏,第二个没有。

我创建了一个自定义驱动的过渡动画,从控制器一转到控制器二。

当我在子视图控制器(橙色)上时,我通过从上到下平移来启动驱动转换。拖动时可以看到状态栏又回来了。 UIButton "Hello" 也在移动。

我取消转换。然后我再次启动它,你可以看到状态栏也回来了,但这一次,我的按钮没有移动,它停留在同一位置,就好像状态栏仍然隐藏一样。

知道为什么一旦转换被取消至少一次后它会表现得像这样吗?

(我什至没有谈论取消时动画加倍的奇怪之处(可能是模拟器的一个错误,因为它在我的 iphone 6 9.1 和我的 iphone 5 8.4 上没有这样做。)

【问题讨论】:

我不认为这是模拟器的问题。我把它放在 iPhone 6 (ios 9) 上,它仍然是一个问题。 我的回答解决了你的问题吗? 我还没来得及检查,我会尽快通知你。还是谢谢。 @Nico 如果它回答了您的问题,请不要忘记接受它作为最佳答案。 【参考方案1】:

地址:import Foundation

然后添加一个插座:

class ViewController: UIViewController @IBOutlet weak var topConstraint: NSLayoutConstraint! ... 然后在视图消失时将值更改为 0,然后在视图出现时更改为 20:

override func viewWillAppear(animated: Bool) 
    topConstraint.constant = 20.0


override func viewWillDisappear(animated: Bool) 
    topConstraint.constant = 0.0

完整代码(请务必记住将约束连接到插座):

import UIKit
import Foundation

class ViewController: UIViewController 

    @IBOutlet weak var topConstraint: NSLayoutConstraint!
    let controllerTransition = InteractiveControllerTransition(gestureType: .Pan)
    let controllerTransitionDelegate = ViewController2Transition()

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

        controllerTransition.delegate = controllerTransitionDelegate
        controllerTransition.edge = .Bottom


    

    override func viewWillAppear(animated: Bool) 
        topConstraint.constant = 20.0
    

    override func viewWillDisappear(animated: Bool) 
        topConstraint.constant = 0.0
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    @IBAction func unwindToViewController(sender: UIStoryboardSegue)  

    override func prefersStatusBarHidden() -> Bool 
        return false
    

    @IBAction func helloButtonAction(sender: UIButton) 
//      let storyBoard = UIStoryboard(name: "Main", bundle: nil)
//      let vc = storyBoard.instantiateViewControllerWithIdentifier("ViewController2") as! ViewController2
//      
//      vc.transitioningDelegate = controllerTransition
//      controllerTransition.toViewController = vc
//      
//      self.presentViewController(vc, animated: true, completion: nil)

        let storyBoard = UIStoryboard(name: "Main", bundle: nil)
//      let nvc = storyBoard.instantiateViewControllerWithIdentifier("NavigationViewController2") as! UINavigationController
//      let vc = nvc.topViewController as! ViewController2

        let vc = storyBoard.instantiateViewControllerWithIdentifier("ViewController2") as! ViewController2





//      nvc.transitioningDelegate = controllerTransition
        vc.transitioningDelegate = controllerTransition
        controllerTransition.toViewController = vc

//      self.presentViewController(nvc, animated: true, completion: nil)
        self.presentViewController(vc, animated: true, completion: nil)

    


【讨论】:

问题是它更像是一个 hack 而不是真正的解决方案,我仍然不明白为什么它会这样......但它似乎工作:)。我只需将topConstraint.constant = 20.0 更改为topConstraint.constant = statusBarHeight 并在顶部添加let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.height

以上是关于隐藏状态栏的视图控制器的交互式视图控制器转换的主要内容,如果未能解决你的问题,请参考以下文章

在某些视图控制器中隐藏状态栏 *特定*

检查使用模态视图控制器隐藏的 iOS 状态栏

仅在模态显示的视图控制器上隐藏状态栏

使用自定义视图控制器转换,我在哪里可以隐藏状态栏?

UINavigationController 推送带有隐藏导航栏的视图控制器

将带有可见导航栏的视图控制器弹出到带有隐藏导航栏的视图控制器时,带有 interactivePopGestureRecognizer 的黑色区域