隐藏导航栏而不移动scrollView

Posted

技术标签:

【中文标题】隐藏导航栏而不移动scrollView【英文标题】:Hide navigation bar without moving scrollView 【发布时间】:2016-04-15 10:48:36 【问题描述】:

我有一个 viewController,在其中显示用于添加缩放功能的图像我在 viewController 和 ScrollView 中添加了 scrollView 我添加了 ImageView 一切正常,期待一件事,正在隐藏,并显示栏(导航栏 + 选项卡bar) 点按,但是当隐藏它们时,我的 imageView 会向上移动,请参阅下面的图片

请看这里的图片和条形图。

在这里,我只是点击了视图,但条形图被隐藏了,但正如您所见,我的 imageView 也从之前的位置移动了,这就是我想要解决的问题,我不想移动我的 imageView。

这就是我隐藏导航栏的方式:

     func tabBarIsVisible() ->Bool 
    return self.tabBarController?.tabBar.frame.origin.y < CGRectGetMaxY(self.view.frame)



func toggle(sender: AnyObject) 
    navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true)
         setTabBarVisible(!tabBarIsVisible(), animated: true)

 

知道如何在不影响其他视图的情况下隐藏和显示条吗?

【问题讨论】:

所以你的图像总是在视图的中心?您是否尝试在 bar 消失时再次设置其中心? 好吧,再次设置在中心是有意义的,但我们没有其他选择吗?您还记得photos 应用程序中 bar 的隐藏过渡吗?它只是逐渐消失而不是向上移动任何想法如何做到这一点? 我没有任何 iPhone,所以我不知道照片应用的具体功能。但是您可以使用它添加淡入淡出动画:-)。 @khuong291 嘿,你能给我任何教程的链接吗?这样我就可以知道如何淡化导航栏 是的,肯定会很棒:D 【参考方案1】:

问题是您需要将imageView 的约束设置为superView,而不是TopLayoutGuideBottomLayoutGuide

像这样:

然后你可以做这样的事情来使动画顺利进行:

import UIKit

class ViewController: UIViewController 

    @IBOutlet var imageView: UIImageView!
    var barIsHidden = false
    var navigationBarHeight: CGFloat = 0
    var tabBarHeight: CGFloat = 0

    override func viewDidLoad() 
        super.viewDidLoad()
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.hideAndShowBar))
        view.addGestureRecognizer(tapGesture)
        navigationBarHeight = (self.navigationController?.navigationBar.frame.size.height)!
        tabBarHeight = (self.tabBarController?.tabBar.frame.size.height)!
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

    func hideAndShowBar() 
        print("tap!!")
        if barIsHidden == false 
            UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseOut, animations: 
                // fade animation
                self.navigationController?.navigationBar.alpha = 0.0
                self.tabBarController?.tabBar.alpha = 0.0
                // set height animation
                self.navigationController?.navigationBar.frame.size.height = 0.0
                self.tabBarController?.tabBar.frame.size.height = 0.0
                , completion:  (_) in
                    self.barIsHidden = true
            )
         else 
            UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseOut, animations: 
                // fade animation
                self.navigationController?.navigationBar.alpha = 1.0
                self.tabBarController?.tabBar.alpha = 1.0
                // set height animation
                self.navigationController?.navigationBar.frame.size.height = self.navigationBarHeight
                self.tabBarController?.tabBar.frame.size.height = self.tabBarHeight
                , completion:  (_) in
                    self.barIsHidden = false
            )
        
    


结果如下:

我已经为您创建了一个示例项目:https://github.com/khuong291/Swift_Example_Series

你可以在 project 37

看到它

希望这会对你有所帮助。

【讨论】:

以上是关于隐藏导航栏而不移动scrollView的主要内容,如果未能解决你的问题,请参考以下文章

滚动时隐藏导航栏而不隐藏状态栏及其背景

隐藏地址栏而不隐藏智能应用横幅

当用户改变设备方向时,如何只旋转导航栏而不旋转视图?

在 iOS 7 中更新导航栏而不更改视图

UINavigationController 仅隐藏导航栏 - 后退动画问题

使用新 URL 更新地址栏而不使用哈希或重新加载页面 [重复]