IOS自定义导航栏的按钮 (UIBarButtonItem)和n
2016-12-25 本文已影响657人
张付东
现在写项目,凡事涉及navigationItem的知识点,几乎都是自定义UINavigationBar上的UIBarButtonItem,因为很多时候,设计师在设计的时候,都会特别注意UIBarButtonItem按钮的字体大小,字体颜色以及按钮距离左边距或者右边距的大小... 在这种情况下,就只能采取自定义的方法,的确自定义的方法所展现出来的效果还是不错的,所以建议一般情况下,都使用自定义的方法......
1: 建议用类别的方法来自定义UIBarButtonItem,如下:
思路: 在原来返回按钮的位置上在多加一个占位的Item
-
创建类别
步骤一.png
- 利用类方法返回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;
- 利用类方法返回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
- 在你所需要的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:)]];
}
- 如图所示:
2: 自定导航栏的title
- 代码如下
- (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;
}
- 如图所示:
3: 注意点
1)因为自定义UIBarButton,重写了系统的push方法,系统的侧滑功能就会失效,还有就是侧滑功能实现原理:当用户使用侧滑功能的时候,系统是通过代理去通知实现侧滑功能,但是如果重写了push,那么代理知道,既然重写了push方法,那么代理就会通知系统不要去实现侧滑功能,这样就使得侧滑功能失效,或者产生bug
-
网上又一些关于此类问题的解决方法,具体链接如下
-
还有就是之前查资料的时候,网上也提供了一个全屏侧滑的三方库,建议使用,具体使用说明,如下链接所示:
备注:
self.fd_interactivePopDisabled = YES; // 取消当前界面的全屏侧滑手势操作
self.navigationController.fd_prefersNavigationBarHidden = YES; // 隐藏导航栏