iOS开发的正确姿势iOS程序猿iOS学习笔记

IOS自定义导航栏的按钮 (UIBarButtonItem)和n

2016-12-25  本文已影响657人  张付东

现在写项目,凡事涉及navigationItem的知识点,几乎都是自定义UINavigationBar上的UIBarButtonItem,因为很多时候,设计师在设计的时候,都会特别注意UIBarButtonItem按钮的字体大小,字体颜色以及按钮距离左边距或者右边距的大小... 在这种情况下,就只能采取自定义的方法,的确自定义的方法所展现出来的效果还是不错的,所以建议一般情况下,都使用自定义的方法......

1: 建议用类别的方法来自定义UIBarButtonItem,如下:

思路: 在原来返回按钮的位置上在多加一个占位的Item

  1. 创建类别


    步骤一.png
步骤二.png
  1. 利用类方法返回UIBarButtonItem(.h文件)
#import <UIKit/UIKit.h>

@interface UIBarButtonItem (customItem)

/**
 自定义UIBarButtonItem
 
 @param frame           frame
 @param title           按钮的title
 @param leftEdge        按钮文字距离左边距的距离
 @param backgroundColor 按钮的背景色
 @param textColor       按钮的字体颜色
 @param font            按钮的font大小
 @param textAlignment   按钮字体的对其情况
 @param target          target
 @param action          action
 
 @return UIBarButtonItem
 */
+(UIBarButtonItem*) itemWithFrame:(CGRect) frame title:(NSString*) title leftEdge:(CGFloat) leftEdge backgroundColor:(UIColor*) backgroundColor textColor:(UIColor*) textColor font:(CGFloat) font textAligment:(NSTextAlignment) textAlignment targe:(id) target action:(SEL) action;

/**
 指定 UIBarButtonSystemItemFixedSpace(固定间距值) 创建UIBarButtonItem;(如果用系统自定义的方法设置按钮,会自动调节按钮的间距)
 
 @param space 两个item之间的间距
 
 @return UIBarButtonItem
 */
+(UIBarButtonItem*) itemFixedSpace:(NSInteger) space;
  1. 利用类方法返回UIBarButtonItem(.m文件)
#import "UIBarButtonItem+customItem.h"

@implementation UIBarButtonItem (customItem)

+(UIBarButtonItem*) itemWithFrame:(CGRect) frame title:(NSString*) title leftEdge:(CGFloat) leftEdge backgroundColor:(UIColor*) backgroundColor textColor:(UIColor*) textColor font:(CGFloat) font textAligment:(NSTextAlignment) textAlignment targe:(id) target action:(SEL) action
{
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
    [btn setTitle:title forState:UIControlStateNormal];
    btn.titleLabel.font = [UIFont systemFontOfSize:font];
    btn.frame = frame;
    btn.backgroundColor = backgroundColor;
    [btn setTitleColor:textColor forState:UIControlStateNormal];
    [btn setTitleEdgeInsets:UIEdgeInsetsMake(0, leftEdge, 0, 0)];
    
    if (textAlignment == NSTextAlignmentLeft)
    {
        btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
        
    }
    else if (textAlignment == NSTextAlignmentRight)
    {
        btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
    }
    else
    {
        btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
    }
    
    return [[UIBarButtonItem alloc] initWithCustomView:btn];
}

+(UIBarButtonItem*) itemFixedSpace:(NSInteger) space
{
    UIBarButtonItem* negativeSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    /**
     *  如果是rightBarButtonItems:
     *  width为负数时,相当于btn向右移动width数值个像素(系统自带的按钮本身和边界间距为5pix,所以width设为-5时,间距正好调整).
     *  默认为0;width为正数时,正好相反,相当于往左移动width数值个像素
     */
    
    /**
     *  如果是leftBarButtonItems:
     *  width为负数时,相当于btn向左移动width数值个像素(系统自带的按钮本身和边界间距为5pix,所以width设为-5时,间距正好调整).
     *  默认为0;width为正数时,正好相反,相当于往右移动width数值个像素
     */
    negativeSpace.width = space;
    return negativeSpace;
}
@end
  1. 在你所需要的controller中引用即可 (切记添加类别的头文件#import "UIBarButtonItem+customItem.h"
    )
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];

    self.navigationItem.leftBarButtonItems = @[[UIBarButtonItem itemFixedSpace:-12],[UIBarButtonItem itemWithFrame:CGRectMake(0, 0, 60, 40) title:@"返回" leftEdge:0 backgroundColor:[UIColor orangeColor] textColor:[UIColor blackColor] font:14.0f textAligment:NSTextAlignmentLeft targe:self action:@selector(leftItemAction:)],];
    
    self.navigationItem.rightBarButtonItems = @[[UIBarButtonItem itemFixedSpace:-12],[UIBarButtonItem itemWithFrame:CGRectMake(0, 0, 60,40) title:@"点击" leftEdge:0 backgroundColor:[UIColor orangeColor] textColor:[UIColor blackColor] font:14.0f textAligment:NSTextAlignmentRight targe:self action:@selector(rightItemAction:)]];
}
  1. 如图所示:
自定义的UIBarbutton.png
2: 自定导航栏的title
  1. 代码如下
- (void)viewDidLoad
{
    [super viewDidLoad];
   /*titlelabel的宽度不受影响,但是titleLabel的高度不能为0*/
    UILabel * titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 0, 20)] ;
    titleLabel.text = @"自定义title";
    titleLabel.backgroundColor = [UIColor blueColor];
    titleLabel.textColor = [UIColor whiteColor];
    titleLabel.font = [UIFont systemFontOfSize:17];
    self.navigationItem.titleView = titleLabel;
}
  1. 如图所示:
titleView.png
3: 注意点

1)因为自定义UIBarButton,重写了系统的push方法,系统的侧滑功能就会失效,还有就是侧滑功能实现原理:当用户使用侧滑功能的时候,系统是通过代理去通知实现侧滑功能,但是如果重写了push,那么代理知道,既然重写了push方法,那么代理就会通知系统不要去实现侧滑功能,这样就使得侧滑功能失效,或者产生bug

  1. 网上又一些关于此类问题的解决方法,具体链接如下

  2. 还有就是之前查资料的时候,网上也提供了一个全屏侧滑的三方库,建议使用,具体使用说明,如下链接所示:
    备注:
    self.fd_interactivePopDisabled = YES; // 取消当前界面的全屏侧滑手势操作
    self.navigationController.fd_prefersNavigationBarHidden = YES; // 隐藏导航栏

参考文章:
工具条按钮间距的调整
IOS全局返回按钮和全屏侧滑功能
一个丝滑的全屏滑动返回手势

上一篇下一篇

猜你喜欢

热点阅读