Swift - 滚动时缩小导航栏

Posted

技术标签:

【中文标题】Swift - 滚动时缩小导航栏【英文标题】:Swift - Shrink Navigation Bar on scroll 【发布时间】:2015-05-05 12:51:42 【问题描述】:

我真的被困在这里了。我想在向下滚动 UITableView 时缩小导航栏,并在向上滚动时再次放大它。我设法改变了导航栏的大小,但标题图像并没有随着导航栏缩小。

我想和 Safari 完全一样,问题是我的 TitleView 的高度在缩小,但宽度永远不会改变。

这是我用来改变滚动条高度的代码。

func scrollViewDidScroll(scrollView: UIScrollView) 
    var navbar = navigationController?.navigationBar
    var dir:CGPoint = tableview.panGestureRecognizer.translationInView(self.tableview)
    var scrollViewHeight = tableview.frame.size.height
    var scrollContentSizeHeight = tableview.contentSize.height
    var scrollOffset = tableview.contentOffset.y

    if (dir.y > 0 && self.formernavstate == "small") 
        self.formernavstate = "big"

        UIView.animateWithDuration(0.5, delay:0.0, options: UIViewAnimationOptions.AllowAnimatedContent, animations:  () -> Void in

        println("")
        navbar?.frame.origin.y = 20
        self.navigationItem.titleView?.transform = CGAffineTransformMakeScale(0.52, 0.6)
        , completion: nil)
    

    if (dir.y < 0 && self.formernavstate == "big") 
        self.formernavstate = "small"   
        navbar?.frame.origin.y = 0
        navigationItem.titleView?.transform = CGAffineTransformMakeScale(0.0001, 0.2)
    

【问题讨论】:

【参考方案1】:

我实现了一个带有自定义“标题”的 Swift 3 版本,并根据@chauhan 的回答调整了它的高度约束:

extension ViewController: UIScrollViewDelegate 

    func scrollViewDidScroll(_ scrollView: UIScrollView) 
        if scrollViewOffset < scrollView.contentOffset.y 
            shrinkHeader(shrink: true)
         else if scrollViewOffset > scrollView.contentOffset.y 
            shrinkHeader(shrink: false)
        
    

    func shrinkHeader(shrink: Bool) 
        if shrink 
            if self.headerContainerHeightConstraint.constant > CGFloat(minHeaderHeight) 
                UIView.animate(withDuration: 0.1, animations: 
                    self.headerContainerHeightConstraint.constant = self.headerContainerHeightConstraint.constant - 2
                    self.view.layoutIfNeeded()
                )
            
         else 
            if self.headerContainerHeightConstraint.constant < CGFloat(maxHeaderHeight) 
                UIView.animate(withDuration: 0.1, animations: 
                    self.headerContainerHeightConstraint.constant = self.headerContainerHeightConstraint.constant + 6
                    self.view.layoutIfNeeded()
                )
            
        
    

【讨论】:

以上是关于Swift - 滚动时缩小导航栏的主要内容,如果未能解决你的问题,请参考以下文章

导航栏、正文和页脚的滚动问题

UITableView在导航栏下滚动

导航栏在推送到新视图控制器时会缩小

25.当屏幕缩小的时候,固定顶部的导航栏的左右滚动

用户滚动时隐藏导航栏

隐藏导航栏时隐藏状态栏 - SWIFT iOS8