iOS 11 UINavigationItem 去除左右间隙

iOS 11 UINavigationItem 去除左右间隙

stonemover 关注

2017.10.20 11:22* 字数 349 阅读 822评论 5喜欢 3

前言

iOS 11版本由于对于Nav层级结构的改变,导致以前的方法无法达到理想的移动效果,使顶部的按钮完全靠左,或者是靠右.

该修改思路目前对于iOS 11.2的系统部分情况已经无效.

原因是由于从上一个vc返回到当前vc的时候,可能不会触发当前vc的viewDidLayoutSubviews方法,就算触发了此时self.navigationController.navigationBar也是空的,导致取不到需要修改约束的view,所以造成了约束无法修改为0,达不到现有效果.

临时修改方法

直接写一个UINavigationBar的分类,在分类中重写了layoutSubviews方法.

重写了之后应该就将原有添加约束的代码覆盖掉了,所以边距不设置也为0了.不过这样的话,内部所有的布局都需要自己完成.

- (void)layoutSubviews{

    for (UIView *subview in self.subviews) {

        if ([NSStringFromClass(subview.class) containsString:@"UIBarBackground"]) {

            if (subview.subviews.count>2) {

                return;

            }

            UIImageView * img=[[UIImageView alloc]initWithFrame:CGRectMake(0, -20, ScreenWidth, 64)];

            img.image=[UIImage imageNamed:@"nav_bg"];

            [subview addSubview:img];

        }

    }

    

}

修改思路

在iOS11之前保持原有方式进行设置,iOS11之后进行额外的边距约束修改达到移动效果.

从viewDebug的界面上观察可以看到需要将UIButtonBarStackView距离左边和右边的16的约束改为0即可.

 

图片.png

核心代码

配置导航器view代码

//0:leftBarButtonItems,1:rightBarButtonItems

- (void)initBarItem:(UIView*)view withType:(int)type{

    UIBarButtonItem * buttonItem = [[UIBarButtonItem alloc]initWithCustomView:view];

    //解决按钮不靠左 靠右的问题.iOS 11系统需要单独处理

    UIBarButtonItem * spaceItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];

    spaceItem.width = -16;//这个值可以根据自己需要自己调整

    switch (type) {

        case 0:

            if (!IS_IOS_VERSION_11) {

                self.navigationItem.leftBarButtonItems =@[spaceItem,buttonItem];

            }else{

                self.navigationItem.leftBarButtonItems =@[buttonItem];

            }

            break;

        case 1:

            if (!IS_IOS_VERSION_11) {

                self.navigationItem.rightBarButtonItems =@[spaceItem,buttonItem];

            }else{

                self.navigationItem.rightBarButtonItems =@[buttonItem];

            }

            break;

            

        default:

            break;

    }

}

处理iOS11情况下的偏移问题,将边距为16的约束的值改为0.

-(void)viewDidLayoutSubviews{

    if (!IS_IOS_VERSION_11) return;

    UINavigationItem * item=self.navigationItem;

    NSArray * array=item.leftBarButtonItems;

    if (array&&array.count!=0){

        //这里需要注意,你设置的第一个leftBarButtonItem的customeView不能是空的,也就是不要设置UIBarButtonSystemItemFixedSpace这种风格的item

        UIBarButtonItem * buttonItem=array[0];

        UIView * view =[[[buttonItem.customView superview] superview] superview];

        NSArray * arrayConstraint=view.constraints;

        for (NSLayoutConstraint * constant in arrayConstraint) {

            //在plus上这个值为20

            if (fabs(constant.constant)==16) {

                constant.constant=0;

            }

        }

    }

}

 

改后效果.png

Demo地址:https://github.com/StoneMover/navDemo.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值