最近在仿寫 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(_:)方法中用transform對scaleView進行縮放:
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é)中...),有錯誤的地方請大家指出,共同進步。
