美文网首页iOS Developer
自定义navigationItem控制它与屏幕的间距

自定义navigationItem控制它与屏幕的间距

作者: 小qiang | 来源:发表于2017-01-10 18:44 被阅读0次

    如下图1所示,正常的在一个UINavigationController中,self.navigationItem.leftBarButtonItem 和self.navigationItem.rightBarButtonItem默认都是距离两边都有一定距离的,而且navigationItem是继承于NSObject,我们不能设置leftItem、rightItem、以及titleView的frame。但是经常会有需求导航栏navigationBar上titleView和rightItem都是紧挨着屏幕两边或者是间距很小,用iOS默认的设置往往都达不到想要的效果。根据我的实践经验,有两种方式可以实现以上的需求。下面我简单说一下思路

    系统默认的leftItem、rightItem、和titleView布局风格就是如下图一样的,中间的titleView的宽度会取决于于leftItem和rightItem的宽度,在这里我先 假设leftItem距离屏幕最左边的距离和rightItem距离屏幕最右边的距离都是space=20。原则就是:会先确保leftItem 和rightItem的布局完的情况下再布局titleView,而titleView的布局时会优先考虑参照屏幕居中对齐,当这个居中对齐布局放的下时,不会重叠到leftItem 和rightItem时,就是我们想要的title居中显示的效果。当 titleView 的居中布局放不下,但是titleView的宽度是放的下时。有两种情况:1、(titleView距离leftItem的距离小于 (titleView的宽度/2))这种情况下titleView会与leftItem保持最小距离布局,导航栏的title不是居中显示的,会往右边偏移2、(titleView距离rightItem的距离小于 (titleView的宽度/2))这种情况下titleView会与rightItem保持最小距离布局导航栏的title不是居中显示的,会往左偏移

    **当titleView的宽度远大于中间的空隙,titleView的宽度放不下时,titleView也会像下图居中显示,与rightItem和leftItem都保持最小间距

    图1默认的leftItem、rightItem、和titleView布局

    为了实现我们想要的 leftItem和rightItem 都距离屏幕边框很近,然后title居中显示的效果。有两种方式:

    第一种方式:就是我自定义 leftItem、rightItem 的时候(initWithCustomView),都在自定义的view上面 add一个子view 让这个子view来控制 与屏幕的间距。

    图2 中间titleview就是一个label,这样它就不会超出范围 重叠到 rightItem 保存的位置。

    特别提示:leftItem点击区域太大的解决办法:我们用一个自定义设置titleView。self.navigationItem.titleView = label;然后给titleview也加上相应的手势点击就可以控制leftItem的点击区域不会往右边中间靠。

    中间titleview 是一个view add一个label组成,结果label的宽度 是会按真实的尺寸显示,会超出 view的宽度而挤到右边保存的位置

    第二种方式:就是我设置BarButtonItem的时候 其实是用的setBarButtonItems方法。给它插入透明的一个item,然后去设置一个偏移距离。UIBarButtonSystemItemFixedSpacenegativeSeperator.width= -20;

    UIView *view = [[UIViewalloc]initWithFrame:CGRectMake(0,0,30,30)];

    view.backgroundColor= [UIColorredColor];

    UIBarButtonItem*leftButton = [[UIBarButtonItemalloc]initWithCustomView:view];

    UIBarButtonItem*rightButton = [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemActiontarget:selfaction:@selector(rightItemClick:)];

    [self.navigationItem setLeftBarButtonItem:leftButton ];//这个方法是在category里面重写了的

    [self.navigationItem setRightBarButtonItem:rightButton];//这个方法是在category里面重写了的

    [self.navigationController.navigationBar setTintColor: [UIColororangeColor]];//如果不是自定义的navigationItem。整体设置navigationBar上字体和图案的颜色,性质跟tabbar一样的,设置成一个颜色,就不会管图片的颜色。当然用的initWithCustomView这个方法除外(这个是自定义navigationItem)

    [self.navigationController.navigationBarsetBarTintColor:[UIColorwhiteColor]];//整体设置navigationBar的背景色

    用第二种方式实现的效果

    在 UINavigationItem+Margin.m 里面会有下面两个方法:

    - (void)setLeftBarButtonItem:(UIBarButtonItem*)_leftBarButtonItem

    {

    if([[[UIDevicecurrentDevice]systemVersion]floatValue] >=7.0)

    {

    UIBarButtonItem*negativeSeperator = [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpacetarget:nilaction:nil];

    negativeSeperator.width= -20;

    if(_leftBarButtonItem)

    {

    [selfsetLeftBarButtonItems:@[negativeSeperator, _leftBarButtonItem]];

    }

    else

    {

    [selfsetLeftBarButtonItems:@[negativeSeperator]];

    }

    }

    else

    {

    [selfsetLeftBarButtonItem:_leftBarButtonItemanimated:NO];

    }

    }

    - (void)setRightBarButtonItem:(UIBarButtonItem*)_rightBarButtonItem

    {

    if([[[UIDevicecurrentDevice]systemVersion]floatValue] >=7.0)

    {

    UIBarButtonItem*negativeSeperator = [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpacetarget:nilaction:nil];

    negativeSeperator.width= -20;

    if(_rightBarButtonItem)

    {

    [selfsetRightBarButtonItems:@[negativeSeperator, _rightBarButtonItem]];

    }

    else

    {

    [selfsetRightBarButtonItems:@[negativeSeperator]];

    }

    }

    else

    {

    [selfsetRightBarButtonItem:_rightBarButtonItemanimated:NO];

    }

    }

    第一次尝试写文章,有许多不足之处请多多指点。

    相关文章

      网友评论

        本文标题:自定义navigationItem控制它与屏幕的间距

        本文链接:https://www.haomeiwen.com/subject/jjqlbttx.html