IOS 15 优雅的去掉导航栏下的横线和iOS 15下导航栏颜色设置失效的解法

1 iOS 15下导航栏失效的缘由

根本缘由是ios改变了导航栏背景色设置的逻辑,导致之前设置失效了,详情参考官网。目前需要使用UINavigationBarAppearance来完成设置。

      if #available(iOS 15.0, *) {
            let standardAppearance = UINavigationBarAppearance()
            standardAppearance.configureWithOpaqueBackground()
            standardAppearance.backgroundColor = UIColor.white;
            standardAppearance.shadowImage = generateImageWithColor(color: UIColor.white) // 去掉导航栏阴影线的关键。
            navigationController?.navigationBar.standardAppearance = standardAppearance // 重新设置外观
            navigationController?.navigationBar.scrollEdgeAppearance = standardAppearance // iOS 15后这个逻辑的改变,导致之前的设置方式无效
        } else {
            navigationController?.navigationBar.tintColor = UIColor(hex: "363636")
            navigationController?.navigationBar.barTintColor = UIColor.white
        }

2 去掉导航栏横线

在iOS 15上,我们发现使用一般的设置方法navigationController?.navigationBar. shadowImage = UIImage()或者standardAppearance.shadowImage = UIImage()竟然无效!!!,难道说真的要使用复杂的写法找出shadowImage然后把它隐藏掉???
网上有写法是找到阴影线的控件把它隐藏掉,我感觉这种方式太复杂,就这么一个简单的设置需要写那么多的代码,得不常失。

思路

既然横线在导航栏是一个图片控件,那么为什么我们不传给他一个带颜色的图像就行了吗?当然我们不能够专门为一个横线去找设计师要一张图片吧,不要担心我们可以自己绘制一个。下面就是把颜色转成图片的方法。

private func generateImageWithColor(color:UIColor) -> UIImage{
        let rect = CGRect.init(x: 0, y: 0, width: 1, height: 1)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()!
        context.setFillColor(color.cgColor)
        context.fill(rect)
        let img = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return img!
    }

注我们绘制的是一个像素点完全不用担心它会消耗超级多的资源,UIViewImage会自动充填剩余空间的,所以我们只要绘制1个像素点即可。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容