iOS导航栏遮挡

导航栏遮挡tableView视图内容解决

多个ScrollView或其子类使用导致导航栏遮挡问题

    在iOS开发中UINavigationViewController是一个非常重要的控件,可是有时候使用时会导致导航栏遮挡视图的问题,比如左边使用tableView,右边使用collectionView。

    遮挡问题如下图:


解决办法

    1.在使用storyboard做布局的时候,一开始就设置top bar为有导航栏的,然后添加视图,做相关约束。

    2.使用iOS7新增加ViewController的属性edgeForExtendedLayout(控制视图在Controller中扩张样式,默认为四边/全屏扩张),将值设为UIEdge(rawValue:0),或者不设置上边即可使视图不会颜色到导航栏和状态栏视图层下部。

代码参考[swift]:

var edgeOptions:UIRectEdge = [.left,.bottom,.right] //注意位移多选枚举的使用
self.edgesForExtendedLayout = edgeOptions
其中UIRectEdge枚举定义
public struct UIRectEdge : OptionSet {

    public init(rawValue: UInt)

    
    public static var top: UIRectEdge { get }

    public static var left: UIRectEdge { get }

    public static var bottom: UIRectEdge { get }

    public static var right: UIRectEdge { get }

    public static var all: UIRectEdge { get } //视图四周都延时
}

使用该方法时,导航栏好像不能设置为半透明。

扩展a:Swift位移类型枚举的定义与使用

使用过OC的朋友都应该知道位移型枚举,使用的时候可以使用"|"传入多个枚举值。

而swift的位移多选型枚举必须遵循optionSet,使用的时候以传入一个数组的形式使用,注意但是不能声明为数组型是的,如上使用方法。

扩展b:将视图延伸到状态栏下

设置controller的属性extendedLayoutIncludeOpaqueBar(默认值为false)为true,而且当状态栏为隐藏或者透明的时候才有效

所以这个可以用来设置被遮挡或者将内容可以放在导航栏底层去


3.使用布局约束将视图强行移出导航栏之外(不推荐)

具体方法就是在storyboard中拉出约束,并设置变量,把相关的视图也要拉过来,在设置约束或者视图将要出现或者加载的时候修改约束。

修改代码如下:

if var nav = self.navigationController {
            CollectionViewTopConstraint = NSLayoutConstraint(item: CollectionViewTopConstraint.firstItem, attribute: .top, relatedBy: .equal, toItem: CollectionViewTopConstraint.secondItem, attribute: .top, multiplier: 1, constant: 44+20)//注意:需要加上状态栏高度20
            //一般状态的导航栏高度为44(横向模式为32).含prompt的为74,当然,你也可以取属性值获取
            self.colletionView.translatesAutoresizingMaskIntoConstraints = false //必须设置,否则约束无效
            self.view.addConstraint(CollectionViewTopConstraint)                 //约束添加在父视图上,不是添加字自身视图
            print(CollectionViewTopConstraint)
        }

最后修改效果图如下:


其他解决参考原理:传送门

隐藏导航栏,状态栏留白问题。

    如下图所示,状态栏下方为空白,视图没有填充满(iOS11会出现这种问题),整个视图结构是SuperView 上放tableView。


解决:

iOS7~iOS10

    1、设置控制器的automaticallyAdjustScrollViewInsets属性为false解决。

    2、如果设置:self.edgesForExtendedLayout = 不设置top 也可以解决的(即随便设置其他三个),在设置 1 情况下。(扩展:self.edgesForExtendedLayout设置了哪边,那边就会延伸扩展进去,比如,当有导航栏时,设置了top,则会延伸到导航栏的视图层下面)。

 iOS 11 及以上

    建议理解Safe Area 来做相应的约束。

目标效果:






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值