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

文章主要针对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()
        }

正在上传…

重新上传

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
iOS 导航条iOS 应用程序中常用的一种导航控件,通常用于在不同的视图控制器之间进行导航。下面举例说明: 1. 在 iOS 开发中,可以通过代码或者 storyboard 对导航条进行配置和使用。 2. 在 storyboard 中,可以通过拖拽导航控制器和视图控制器之间的关系,来创建导航条。 3. 通过代码创建导航条的示例代码: ``` // 创建导航条 UINavigationBar *navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)]; // 创建导航项 UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:@"Title"]; // 添加导航项 [navigationBar pushNavigationItem:navigationItem animated:NO]; // 添加导航条到视图中 [self.view addSubview:navigationBar]; ``` 4. 通过代码设置导航条的标题和按钮: ``` // 设置导航条标题 navigationItem.title = @"Title"; // 创建导航条左侧按钮 UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backAction)]; // 设置导航条左侧按钮 navigationItem.leftBarButtonItem = leftBarButtonItem; // 创建导航条右侧按钮 UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStylePlain target:self action:@selector(nextAction)]; // 设置导航条右侧按钮 navigationItem.rightBarButtonItem = rightBarButtonItem; ``` 这些代码可以帮助你快速创建和使用 iOS 导航条

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

边缘998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值