iOS 导航条isTranslucent几个注意点(iOS11及iOS13的变化)

news/2024/7/20 8:29:46 标签: ios, 导航条

文章主要针对11及13之后的导航变化进行总结,主要是设置透明度时对转场,包括标题,背景透明,图片,颜色等设置的影响。

每一个iOS版本的发布苹果最不稳写的可能就数这个导航条了吧,改了又改。

因此isTranslucent一套UI风格中用同一种属性实现,不要部份true部份false。

以NavigationBar的左上角(x,y)对齐屏幕(0,0)作为参考点

条件:

1、VC设置半透明为true时 (self.navigationController?.navigationBar.isTranslucent),APP默认情况下为True

 

可以看到导航条半透明度毛玻璃效果穿透看到背景。ViewController中的View的(x,y)对齐屏幕(0,0) 

2、VC设置半透明属性为False时。

可以看到导航条不能穿透看不到背景。ViewController中的View的(x,y)不对齐屏幕 (0,0)

iOS11中引入safearea来解决由于isTranslucent属性引起来的偏移问题。

1、正常的UIView非UIScrollView子类在布局时使用安全区域和不使用安全区域带来的影响。

不使用safearea的情况:

class DemoViewController: UIViewController {
    
    var radiusView = UIView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .green
 
//        self.navigationController?.navigationBar.isTranslucent = false
        
        view.addSubview(radiusView)
        radiusView.backgroundColor = .orange
        radiusView.layer.cornerRadius = 40
        radiusView.clipsToBounds = true
        
        radiusView.snp.makeConstraints { (make) in
            make.top.equalTo(10) //这里不使用安全区域
            make.width.height.equalTo(80)
            make.centerX.equalToSuperview()
        }
    }
}

 关闭半透明时效果。(isTranslucent = false)

 重点来了iOS11引入了安全区。来看下效果。不受isTranslucent属性的景响。

class DemoViewController: UIViewController {
    
    var radiusView = UIView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.view.backgroundColor = .green
        
        ///这里设置true或false不影响
        self.navigationController?.navigationBar.isTranslucent = false
        
        view.addSubview(radiusView)
        radiusView.backgroundColor = .orange
        radiusView.layer.cornerRadius = 40
        radiusView.clipsToBounds = true
        
        radiusView.snp.makeConstraints { (make) in
            if #available(iOS 11.0, *) {
                make.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(10) //使用安全区
            } else {
                make.top.equalTo(10) //不使用安全区
            }
            make.width.height.equalTo(80)
            make.centerX.equalToSuperview()
        }
    }
}

设置透明时:

 

设置不透时时:

 

 

可以看到11之后使用安全区的效果明显的爽歪歪。不需要再为透明半透明的事烦恼。

那什么情况下需要设计半透明或不透明效果呢。建议11以后的app都使用半透明属性来设计UI。

在半透明开启情况下ScrollView的使用情况 

 默认情况下不设置以下代码时,是完全适配安全区的。

if #available(iOS 11.0, *) {
    //.never 用于处理如果导航条半透明状态下tableview的内容偏移度问题
    tableView.contentInsetAdjustmentBehavior = UIScrollView.ContentInsetAdjustmentBehavior.never 
} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

在不使用上述代码的情况下,在导航条设置透明或不透时,tableview或scrollview的左上解座标都能自动适应显示。

但如果开启之后,就可以看到偏移的效果。这一样来,有些tableview特别是新闻类的,想在滚动的时候能透过导航看到模糊效果。

ScrollView和TableView

针对VC中使用ScorllView或TableView时。谨慎根据UI需求进行设置使用。绿色条为正常显示的内容。主要考察是否被导航条或下面的tabbar拦住的情况。

样式一:
默认条件:
self.navigationController?.navigationBar.isTranslucent = true
...
view.addSubview(scrollview)
scrollview.snp.makeConstraints { (make) in
	make.edges.equalTo(0) ///设置充满
}
其它均不设置

 

 

 scrollview的在contentview能正常在安全区间内显示。即不会被navigationbar或tabbar拦到拖不动。

样式二:
默认条件:
self.navigationController?.navigationBar.isTranslucent = false
...
view.addSubview(scrollview)
scrollview.snp.makeConstraints { (make) in
	make.edges.equalTo(0) ///设置充满
}
其它均不设置

 

 

这个配置会使透航条不透时,但并没景响安全区内容的显示。 

样式三:

self.navigationController?.navigationBar.isTranslucent = true
...
view.addSubview(scrollview)
scrollview.snp.makeConstraints { (make) in
	make.edges.equalTo(0) ///设置充满
}

///增加scrollview不自动适配
self.scrollview.contentInsetAdjustmentBehavior = UIScrollView.ContentInsetAdjustmentBehavior.never

 

 

 可以看到scrollview内容的上下都被挡住了。

样式四:

self.navigationController?.navigationBar.isTranslucent = false
...
view.addSubview(scrollview)
scrollview.snp.makeConstraints { (make) in
	make.edges.equalTo(0) ///设置充满
}

///增加scrollview不自动适配
self.scrollview.contentInsetAdjustmentBehavior = UIScrollView.ContentInsetAdjustmentBehavior.never

 

和样式三差不多,只是上部份不被挡到了。下面部份仍然是被挡住。

样式五:

self.navigationController?.navigationBar.isTranslucent = false

scrollview.snp.makeConstraints { (make) in
    if #available(iOS 11.0, *) {
        //使用安全区上下对齐的方式
        make.top.equalTo(view.safeAreaLayoutGuide.snp.top)
        make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottom)
        make.leading.trailing.equalTo(0)
    } else {
    }
}

 ​​​​​​​

下面是self.navigationController?.navigationBar.isTranslucent = true的样式

 

 

样式六:

self.navigationController?.navigationBar.isTranslucent = false

scrollview.snp.makeConstraints { (make) in
    if #available(iOS 11.0, *) {
        //使用安全区上下对齐的方式
        make.top.equalTo(view.safeAreaLayoutGuide.snp.top)
        make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottom)
        make.leading.trailing.equalTo(0)
    } else {
    }
}

///增加scrollview不自动适配
self.scrollview.contentInsetAdjustmentBehavior = UIScrollView.ContentInsetAdjustmentBehavior.never

 

此效果和样式五一样。

因此scrollview设置了安全区对齐的情况下,无论isTranslucent如何设置都能正常显示出contentview内容。也不受contentInsetAdjustmentBehavior的影响。因此在UI设的时候特别是需要用scrollview或tableview的布局时,就需要针对不同的样式做不同的选择。

isTransluucent = true,还是没有启作用,没有顶到(0,0)点,可能是有地方设置了:

if self.responds(to: #selector(setter: edgesForExtendedLayout)) {
   self.edgesForExtendedLayout = []
}

另IOS13以上 来设置导航透明

if #available(iOS 13.0, *) {
             //注意这个是全局影响的,不要在想要的地方就任意修改
            let appearance = UINavigationBarAppearance()
            appearance.configureWithOpaqueBackground()
            appearance.backgroundColor = .clear
            appearance.shadowColor = .clear
            navigationController?.navigationBar.scrollEdgeAppearance = appearance
            navigationController?.navigationBar.standardAppearance = appearance
        } else {
            self.navigationController?.navigationBar.setBackgroundImage(UIImage(),for: .default)
            self.navigationController?.navigationBar.shadowImage = UIImage()
        }

正在上传…

重新上传


http://www.niftyadmin.cn/n/49961.html

相关文章

集合(Set、Collections、Map、集合嵌套)

目录 Set系列集合 Set系列集合概述 HashSet元素无序的底层原理:哈希表 HashSet元素去重复的底层原理 实现类:LinkedHashSet 实现类:TreeSet Collection体系的特点、使用场景总结 补充知识:可变参数 补充知识:集…

JVM调优几款好用的内存分析工具

对于高并发访问量的电商、物联网、金融、社交等系统来说,JVM内存优化是非常有必要的,可以提高系统的吞吐量和性能。通常调优的首选方式是减少FGC次数或者FGC时间,以避免系统过多地暂停。FGC达到理想值后,比如一天或者两天触发一次…

Vue2.0页面缓存机制联合页面标签的交互(keep-alive + router)

预期效果:(借助iview-ui的在线体验页面示意一下) 项目中只有一部分页面需要缓存,且存在多级路由的页面。每打开一个菜单,就会新增一个 Tab标签,只要 Tab标签不关闭,对应的页面就会被缓存&#x…

Nodejs原型链污染

Nodejs与JavaScript和JSON 有一些人在学习JavaScript时会分不清Nodejs和JavaScript之间的区别,如果没有node,那么我们的JavaScript代码则由浏览器中的JavaScript解析器进行解析。几乎所有的浏览器都配备了JavaScript的解析功能(最出名的就是…

CSS布局

CSS布局 ​一个HTML网页常常被分为不同的区域来显示不同的内容,在设计网页时首先需要思考页面的主体结构和细节分别采用什么样的布局来实现。通常我们使用正常布局、弹性盒子、网格布局来实现页面框架,浮动和定位来进行细节调整和实现特殊效果。表格布局…

Notion 笔记Mac及windows客户端汉化

1、 注册/登录账号: https://www.notion.so/zh-cn 2、下载电脑软件应用: https://www.notion.so/desktop 下载完成后,安装到电脑中,界面如下: 3、下载汉化js插件 地址:https://github.com/Reamd7/n…

OpenResty(5):Openresty 模板渲染

1 导入lua-resty-template 下载 http://luarocks.org/modules/bungle/lua-resty-template 将template.lua文件复制到openresty/lualib/resty/目录下 2 示例 2.1 修改nginx.conf 设置模板路径:set $template_root /usr/local/openresty/nginx/html/templates; 设…

HTTP和HTTPS协议

HTTP协议 HTTP协议是一种应用层的协议,全称为超文本传输协议。 URL URL值统一资源定位标志,也就是俗称的网址。 协议方案名 http://表示的就是协议方案名,常用的协议有HTTP协议、HTTPS协议、FTP协议等。HTTPS协议是以HTTP协议为基础&#…