实现navigationController渐变

IOS

效果

实现思路

先观察NavigationBar的结构图:

可以发现navigationBar后面是有个imageView的,只要把它设置为无图就可以看到透明,设置backgroundColor就不可以

需要注意的是navigationBar还有另一个imageView,其实那个是导航栏下面的那一根细线。

实现

直接获取那张ImageView,然后设置他的透明度 它其实就在subviews的第一个,即,我们可以这样

//Objective-C
UIView barImageView = new UIView()

barImageView = self.navigationController.navigationBar.subviews.firstObject
//swift  

// var barImageView = UIView()
barImageView = (navigationController?.navigationBar.subviews.first)!

然后设置它透明

//swift
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarPosition.top, barMetrics: UIBarMetrics.default)

然后在scrollViewDidScroll方法里面根据偏移量来动态改变barImageView颜色就好

//swift
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    
    let offsetY:CGFloat = scrollView.contentOffset.y
    if (offsetY >= 44) {
        let alpha:CGFloat = min(0.95, 1 - ((50 + 64 - offsetY) / 64)) //50 可以任意改变,控制你的tableView拉到什么样子的时候他才变成不透明

        barImageView.backgroundColor = UIColor.white.withAlphaComponent(alpha)

        if alpha > 0.95 {
            // setNavigationBarTextBlack() 
            //导航栏被拉下来
        }
    }
    else {

        barImageView.backgroundColor = UIColor.white.withAlphaComponent(0.0)
        // setNavigationBarTextClear()
        // 导航栏在初始位置状态
    }
}

补充代码

改变导航栏标题颜色和返回键颜色

//swift
self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white]
self.navigationController?.navigationBar.tintColor = UIColor.white

需要重写viewWillAppear和viewWillDisappear

//
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.tableView.delegate = self;
    self.navigationController?.navigationBar.shadowImage = UIImage()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.tableView.delegate = nil;
    setNavigationBarTextBlack()
}

不然你返回到上一个界面的时候会发现导航栏很奇怪

如果懒得自己写可以试下这个轮子:

https://github.com/ltebean/LTNavigationBar/tree/master