關(guān)于 navigationItem.titleView 滑動縮放的坑

最近在仿寫 Instagram,它的 Timeline 控制器中, tableView滾動過程中navigationItem.titleView會相應(yīng)縮放,效果如下:

ScrollingScaleNavTitleView.gif

錯誤做法:

一開始我是在scrollViewDidScroll(_:)方法中用transform直接對navigationItem.titleView 進行縮放:

override func scrollViewDidScroll(scrollView: UIScrollView) {
  let factor = offsetY / 20
          if factor < 1 && factor > 0 {
              navigationItem.titleView?.transform =   CGAffineTransformMakeScale(1 - factor, 1 - factor)
              rightItemIconView!.transform = CGAffineTransformMakeScale(1 - factor, 1 - factor)
              navigationItem.titleView!.alpha = 1 - factor
              navigationItem.rightBarButtonItem?.customView?.alpha = 1 - factor
          } else if factor <= 0 {
            navigationItem.titleView?.transform = CGAffineTransformIdentity
            navigationItem.titleView!.alpha = 1
            rightItemIconView!.transform = CGAffineTransformIdentity
            navigationItem.rightBarButtonItem?.customView?.alpha = 1

        } else {
            navigationItem.titleView?.transform = CGAffineTransformIdentity
            navigationItem.titleView!.alpha = 0
            rightItemIconView!.transform = CGAffineTransformIdentity
            navigationItem.rightBarButtonItem?.customView?.alpha = 0
        }

        // 下面用到的 tableViewOriginHeight 是 NavBar 的 frame 還沒發(fā)生變化之前 tableView 的高度
        if offsetY >= 0 && offsetY <= UIConstant.UI_NAV_BAR_HEIGHT {
            navigationController?.navigationBar.frame.origin.y = UIConstant.UI_STATUSBAR_HEIGHT - offsetY
            tableView.frame.origin.y = UIConstant.UI_NAV_BAR_HEIGHT + UIConstant.UI_STATUSBAR_HEIGHT - offsetY
            tableView.frame.size.height = tableViewOriginHeight + offsetY
        } else if offsetY > UIConstant.UI_NAV_BAR_HEIGHT {
            navigationController?.navigationBar.frame.origin.y = UIConstant.UI_STATUSBAR_HEIGHT - UIConstant.UI_NAV_BAR_HEIGHT
            tableView.frame.origin.y = UIConstant.UI_STATUSBAR_HEIGHT
            tableView.frame.size.height = tableViewOriginHeight + UIConstant.UI_NAV_BAR_HEIGHT + UIConstant.UI_STATUSBAR_HEIGHT
        } else {
            navigationController?.navigationBar.frame.origin.y = UIConstant.UI_STATUSBAR_HEIGHT
            tableView.frame.origin.y = UIConstant.UI_NAV_BAR_HEIGHT + UIConstant.UI_STATUSBAR_HEIGHT
            tableView.frame.size.height = tableViewOriginHeight
        }

}

得到的結(jié)果是:

titleView 在縮放之后,沒有回復(fù)到原來的尺寸,樓主到現(xiàn)在還布吉島什么原因,有看到這里的大神請指點下,萬分感激

NavTitleViewScaleWrong.gif

解決辦法

  • 把你要縮放的scaleView,用一個普通的UIView裝著,作為一個 container,然后把這個 container 設(shè)置為 navigationItem.titleView
func setupTitleView() {
        let titleView = UIView(frame: CGRectMake(0, 0, 100, 40))
        titleImageView = UIImageView(image: FLIconKit.imageOfNavTitleBgImg(size: titleView.frame.size))
        titleImageView!.clipsToBounds = true
        titleImageView!.frame = titleView.bounds
        titleView.addSubview(titleImageView!)
        titleView.backgroundColor = UIColor.blackColor()
        navigationItem.titleView = titleView
    }

  • scrollViewDidScroll(_:)方法中用transformscaleView 進行縮放:
override func scrollViewDidScroll(scrollView: UIScrollView) {
        let offsetY = scrollView.contentOffset.y
        let factor = offsetY / 20
        if factor < 1 && factor > 0 {
            titleImageView!.transform = CGAffineTransformMakeScale(1 - factor, 1 - factor)
            rightItemIconView!.transform = CGAffineTransformMakeScale(1 - factor, 1 - factor)
            navigationItem.titleView!.alpha = 1 - factor
            navigationItem.rightBarButtonItem?.customView?.alpha = 1 - factor
        } else if factor <= 0 {
            titleImageView!.transform = CGAffineTransformIdentity
            navigationItem.titleView!.alpha = 1
            rightItemIconView!.transform = CGAffineTransformIdentity
            navigationItem.rightBarButtonItem?.customView?.alpha = 1

        } else {
            titleImageView!.transform = CGAffineTransformIdentity
            navigationItem.titleView!.alpha = 0
            rightItemIconView!.transform = CGAffineTransformIdentity
            navigationItem.rightBarButtonItem?.customView?.alpha = 0
        }
        // 下面用到的 tableViewOriginHeight 是 NavBar 的 frame 還沒發(fā)生變化之前 tableView 的高度
        if offsetY >= 0 && offsetY <= UIConstant.UI_NAV_BAR_HEIGHT {
            navigationController?.navigationBar.frame.origin.y = UIConstant.UI_STATUSBAR_HEIGHT - offsetY
            tableView.frame.origin.y = UIConstant.UI_NAV_BAR_HEIGHT + UIConstant.UI_STATUSBAR_HEIGHT - offsetY
            tableView.frame.size.height = tableViewOriginHeight + offsetY
        } else if offsetY > UIConstant.UI_NAV_BAR_HEIGHT {
            navigationController?.navigationBar.frame.origin.y = UIConstant.UI_STATUSBAR_HEIGHT - UIConstant.UI_NAV_BAR_HEIGHT
            tableView.frame.origin.y = UIConstant.UI_STATUSBAR_HEIGHT
            tableView.frame.size.height = tableViewOriginHeight + UIConstant.UI_NAV_BAR_HEIGHT + UIConstant.UI_STATUSBAR_HEIGHT
        } else {
            navigationController?.navigationBar.frame.origin.y = UIConstant.UI_STATUSBAR_HEIGHT
            tableView.frame.origin.y = UIConstant.UI_NAV_BAR_HEIGHT + UIConstant.UI_STATUSBAR_HEIGHT
            tableView.frame.size.height = tableViewOriginHeight
        }
        
    }

最后感謝您的閱讀,筆者是 iOS 開發(fā)新人(苦逼自學(xué)中...),有錯誤的地方請大家指出,共同進步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容