版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.08.04 |
前言
我們的app一般都需要導航欄,極個別的除外,比如說很多游戲是沒有導航欄的,但是絕大部分是都有的,只要有導航欄就需要顯示主題,左右
item
的圖片或者文字,并且需要處理相關的事件,這里我就簡單的封裝了一個UIBarButtonItem
的分類,可以快速的實現左右item
圖片和文字的顯示,并預留了相關接口。整個框架只依賴蘋果的API,不依賴其他第三方,拖入即可使用,簡單方便。
預先了解
我這里寫的是UIBarButtonItem
的分類,可以實現導航左右item
的文字以及圖片的顯示,并可響應相應的方法。
框架實現
下面我們就看一下所寫框架的全部代碼。
1. UIBarButtonItem+JJBarButtonItem.h
#import <UIKit/UIKit.h>
@interface UIBarButtonItem (JJBarButtonItem)
/**
* 該函數的功能返回導航的leftItem
*
* @param target :目標
* @param selector :響應方法
* @param imageNormal :正常的圖片
* @param imageHightlighted :高亮的圖片
* @param titleColorNormal :正常文字顏色
* @param titleColorHightlighted :高亮文字顏色
* @param title :文字
*
* @return 左邊UIBarButtonItem
*/
+ (UIBarButtonItem *)jjLeftItem:(id)target
selector:(SEL)selector
imageNormal:(UIImage *)imageNormal
imageHightlighted:(UIImage *)imageHightlighted
titleColorNormal:(UIColor *)titleColorNormal
titleColorHightlighted:(UIColor *)titleColorHightlighted
title:(NSString *)title;
/**
* 該函數的功能返回導航的rightItem
*
* @param target :目標
* @param selector :響應方法
* @param imageNormal :正常的圖片
* @param imageHightlighted :高亮的圖片
* @param imageDisabled :無法點擊的圖片
* @param titleColorNormal :正常文字顏色
* @param titleColorHightlighted :高亮文字顏色
* @param titleColorDisabled :無法點擊的文字
* @param title :文字
*
* @return 右邊UIBarButtonItem
*/
+ (UIBarButtonItem *)jjRightItem:(id)target
selector:(SEL)selector
imageNormal:(UIImage *)imageNormal
imageHightlighted:(UIImage *)imageHightlighted
imageDisabled:(UIImage *)imageDisabled
titleColorNormal:(UIColor *)titleColorNormal
titleColorHightlighted:(UIColor *)titleColorHightlighted
titleColorDisabled:(UIColor *)titleColorDisabled
title:(NSString *)title;
//幾種簡化默認返回簡化寫法
+ (UIBarButtonItem *)jjDefaultBackItem:(id)target
selector:(SEL)selector
title:(NSString *)title;
+ (UIBarButtonItem *)jjDefaultBackItem:(id)target
selector:(SEL)selector
titleColorNormal:(UIColor *)titleColorNormal
titleColorHightlighted:(UIColor *)titleColorHightlighted
title:(NSString *)title;
+ (UIBarButtonItem *)jjDefaultRightTitleItem:(id)target
selector:(SEL)selector
title:(NSString *)title;
+ (UIBarButtonItem *)jjDefaultRightItem:(id)target
selector:(SEL)selector
titleColorNormal:(UIColor *)titleColorNormal
titleColorHightlighted:(UIColor *)titleColorHightlighted
titleColorDisabled:(UIColor *)titleColorDisabled
title:(NSString *)title;
+ (UIBarButtonItem *)jjDefaultRightImageItem:(id)target
selector:(SEL)selector
imageNormal:(UIImage *)imageNormal
imageHightlighted:(UIImage *)imageHightlighted
imageDisabled:(UIImage *)imageDisabled;
- (UIButton *)jjContentViewButton;
@end
2. UIBarButtonItem+JJBarButtonItem.m
#import "UIBarButtonItem+JJBarButtonItem.h"
#define kDefaultColor ([UIColor whiteColor])
#define kLeftTitleFont (17.0)
#define kRightTitleFont (17.0)
@implementation UIBarButtonItem (JJBarButtonItem)
+ (UIBarButtonItem *)jjLeftItem:(id)target
selector:(SEL)selector
imageNormal:(UIImage *)imageNormal
imageHightlighted:(UIImage *)imageHightlighted
titleColorNormal:(UIColor *)titleColorNormal
titleColorHightlighted:(UIColor *)titleColorHightlighted
title:(NSString *)title
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.backgroundColor = [UIColor clearColor];
[btn setImage:imageNormal forState:UIControlStateNormal];
[btn setImage:imageHightlighted?:imageNormal forState:UIControlStateHighlighted];
[btn setTitleColor:titleColorNormal forState:UIControlStateNormal];
[btn setTitleColor:titleColorHightlighted?:titleColorNormal forState:UIControlStateHighlighted];
[btn setTitle:title forState:UIControlStateNormal];
btn.titleLabel.lineBreakMode = NSLineBreakByTruncatingTail;
btn.titleLabel.font = [UIFont systemFontOfSize:kLeftTitleFont];
// 導航欄高度
CGFloat fNaviBarHeight = 44.0;
// 圖片寬度
CGFloat fImageWidth = 0.0;
if (imageNormal) {
fImageWidth = imageNormal.size.width;
}
// 文本寬度
CGFloat fTitleWidth = 0.0;
if (title.length > 0) {
fTitleWidth = [self jjBoundingSizeWithLabel:btn.titleLabel size:CGSizeMake([UIScreen mainScreen].bounds.size.width, fNaviBarHeight)].width;
}
// 圖片、文本間隔
CGFloat fImageAndTitleEdge = 5.0;
CGFloat fMaxWidth = fminf(fImageWidth + fTitleWidth + fImageAndTitleEdge, [UIScreen mainScreen].bounds.size.width * 0.3);
btn.frame = CGRectMake(0.0, 0.0, fMaxWidth, fNaviBarHeight);
// 文本偏移
CGFloat fLeftEdgeInsets = 5.0;
if (fTitleWidth > 0.0) {
btn.titleEdgeInsets = UIEdgeInsetsMake(0.0, -fLeftEdgeInsets, 0.0, fMaxWidth + fLeftEdgeInsets - fTitleWidth);
}
// 圖片偏移
if (fImageWidth > 0.0) {
btn.imageEdgeInsets = UIEdgeInsetsMake(0.0, -fLeftEdgeInsets, 0.0, fMaxWidth + fLeftEdgeInsets - fImageWidth);
btn.titleEdgeInsets = UIEdgeInsetsMake(0.0, fImageAndTitleEdge - fLeftEdgeInsets, 0.0, fLeftEdgeInsets);
}
btn.exclusiveTouch = YES;
[btn addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:btn];
return item;
}
+ (UIBarButtonItem *)jjRightItem:(id)target
selector:(SEL)selector
imageNormal:(UIImage *)imageNormal
imageHightlighted:(UIImage *)imageHightlighted
imageDisabled:(UIImage *)imageDisabled
titleColorNormal:(UIColor *)titleColorNormal
titleColorHightlighted:(UIColor *)titleColorHightlighted
titleColorDisabled:(UIColor *)titleColorDisabled
title:(NSString *)title
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.backgroundColor = [UIColor clearColor];
[btn setImage:imageNormal forState:UIControlStateNormal];
[btn setImage:imageHightlighted?:imageNormal forState:UIControlStateHighlighted];
[btn setImage:imageDisabled?:imageNormal forState:UIControlStateDisabled];
[btn setTitleColor:titleColorNormal forState:UIControlStateNormal];
[btn setTitleColor:titleColorHightlighted?:titleColorNormal forState:UIControlStateHighlighted];
[btn setTitleColor:titleColorDisabled?:titleColorNormal forState:UIControlStateDisabled];
[btn setTitle:title forState:UIControlStateNormal];
btn.titleLabel.lineBreakMode = NSLineBreakByTruncatingTail;
btn.titleLabel.font = [UIFont systemFontOfSize:kRightTitleFont];
// 導航欄高度
CGFloat fNaviBarHeight = 44.0;
// 圖片寬度
CGFloat fImageWidth = 0.0;
if (imageNormal) {
fImageWidth = imageNormal.size.width;
}
// 文本寬度
CGFloat fTitleWidth = 0.0;
if (title.length > 0) {
fTitleWidth = [self jjBoundingSizeWithLabel:btn.titleLabel size:CGSizeMake([UIScreen mainScreen].bounds.size.width, fNaviBarHeight)].width;
}
// 圖片、文本間隔
CGFloat fImageAndTitleEdge = 5.0;
CGFloat fMaxWidth = fminf(fmaxf(fImageWidth + fTitleWidth + fImageAndTitleEdge, 44.0), [UIScreen mainScreen].bounds.size.width * 0.3);
btn.frame = CGRectMake(0.0, 0.0, fMaxWidth, fNaviBarHeight);
// 圖片偏移
CGFloat fRightEdgeInsets = 2.0;
if (fImageWidth > 0.0) {
btn.imageEdgeInsets = UIEdgeInsetsMake(0.0, fMaxWidth + fRightEdgeInsets - fImageWidth, 0.0, -fRightEdgeInsets);
}
// 文本偏移
if (fTitleWidth > 0.0) {
btn.imageEdgeInsets = UIEdgeInsetsZero;
btn.titleEdgeInsets = UIEdgeInsetsMake(0.0, fRightEdgeInsets + fImageAndTitleEdge, 0.0, -fRightEdgeInsets);
}
btn.exclusiveTouch = YES;
[btn addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:btn];
return item;
}
+ (UIBarButtonItem *)jjDefaultBackItem:(id)target
selector:(SEL)selector
title:(NSString *)title
{
return [UIBarButtonItem jjLeftItem:target
selector:selector
imageNormal:[UIImage imageNamed:@"default_back_normal"]
imageHightlighted:[UIImage imageNamed:@"default_back_hightlighted"]
titleColorNormal:[self jjColorWithHexString:@"#3e3e3e" alpha:1.0]
titleColorHightlighted:[self jjColorWithHexString:@"#858585" alpha:1.0]
title:title];
}
+ (UIBarButtonItem *)jjDefaultBackItem:(id)target
selector:(SEL)selector
titleColorNormal:(UIColor *)titleColorNormal
titleColorHightlighted:(UIColor *)titleColorHightlighted
title:(NSString *)title
{
return [UIBarButtonItem jjLeftItem:target
selector:selector
imageNormal:[UIImage imageNamed:@"default_back_normal"]
imageHightlighted:[UIImage imageNamed:@"default_back_hightlighted"]
titleColorNormal:titleColorNormal
titleColorHightlighted:titleColorHightlighted
title:title];
}
+ (UIBarButtonItem *)jjDefaultRightTitleItem:(id)target
selector:(SEL)selector
title:(NSString *)title
{
return [UIBarButtonItem jjRightItem:target
selector:selector
imageNormal:nil
imageHightlighted:nil
imageDisabled:nil
titleColorNormal:[self jjColorWithHexString:@"#3e3e3e" alpha:1.0]
titleColorHightlighted:[self jjColorWithHexString:@"#858585" alpha:1.0]
titleColorDisabled:nil
title:title];
}
+ (UIBarButtonItem *)jjDefaultRightItem:(id)target
selector:(SEL)selector
titleColorNormal:(UIColor *)titleColorNormal
titleColorHightlighted:(UIColor *)titleColorHightlighted
titleColorDisabled:(UIColor *)titleColorDisabled
title:(NSString *)title
{
return [UIBarButtonItem jjRightItem:target
selector:selector
imageNormal:nil
imageHightlighted:nil
imageDisabled:nil
titleColorNormal:titleColorNormal
titleColorHightlighted:titleColorHightlighted
titleColorDisabled:titleColorDisabled
title:title];
}
+ (UIBarButtonItem *)jjDefaultRightImageItem:(id)target
selector:(SEL)selector
imageNormal:(UIImage *)imageNormal
imageHightlighted:(UIImage *)imageHightlighted
imageDisabled:(UIImage *)imageDisabled
{
return [UIBarButtonItem jjRightItem:target
selector:selector
imageNormal:imageNormal
imageHightlighted:imageHightlighted
imageDisabled:imageDisabled
titleColorNormal:nil
titleColorHightlighted:nil
titleColorDisabled:nil
title:nil];
}
- (UIButton *)jjContentViewButton
{
if ([self.customView isKindOfClass:[UIButton class]]) {
return (UIButton *)(self.customView);
}
return nil;
}
/**
* 該函數的功能返回給定label字符串占的size
* @param label :字符串的label
* @param size :字符串占的size
*/
+ (CGSize)jjBoundingSizeWithLabel:(UILabel *)label size:(CGSize)size
{
NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin;
options |= NSStringDrawingUsesFontLeading;
options |= NSStringDrawingTruncatesLastVisibleLine;
CGRect rect = [label.text boundingRectWithSize:size
options:options
attributes:@{NSFontAttributeName:label.font}
context:nil];
// 加兩個像素, 防止emoji被切掉
return CGSizeMake(ceilf(rect.size.width) + 1.0, ceilf(rect.size.height) + 2.0);
}
/**
* 該函數的功能就是根據給的十六進制數和透明度返回對應的顏色值
* @param stringToConvert :十六進制字符串
* @param alpha :透明度
*/
+ (UIColor *)jjColorWithHexString:(NSString *)stringToConvert alpha:(CGFloat)alpha
{
NSString *cString = [[stringToConvert stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
if ([cString length] < 6) {
return kDefaultColor;
}
if ([cString hasPrefix:@"#"]) {
cString = [cString substringFromIndex:1];
}
if ([cString length] != 6) {
return kDefaultColor;
}
NSRange range = NSMakeRange(0, 2);
NSString *rString = [cString substringWithRange:range];
range.location = 2;
NSString *gString = [cString substringWithRange:range];
range.location = 4;
NSString *bString = [cString substringWithRange:range];
unsigned int red = 0, green = 0, blue = 0;
if ([[NSScanner scannerWithString:rString] scanHexInt:&red] &&
[[NSScanner scannerWithString:gString] scanHexInt:&green] &&
[[NSScanner scannerWithString:bString] scanHexInt:&blue]) {
return [UIColor colorWithRed:((float)red / 255.0f)
green:((float)green / 255.0f)
blue:((float)blue / 255.0f)
alpha:alpha];
}
return kDefaultColor;
}
@end
別的就不多說了,代碼就這么多。
框架驗證
下面就驗證下框架的使用,我們先寫個類調用下試試。
1. JJNavigationVC.m
#import "JJNavigationVC.h"
#import "UIBarButtonItem+JJBarButtonItem.h"
@interface JJNavigationVC ()
@end
@implementation JJNavigationVC
#pragma mark - Override Base Function
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"無題";
self.view.backgroundColor = [UIColor lightGrayColor];
//左邊item
self.navigationItem.leftBarButtonItem = [UIBarButtonItem jjLeftItem:self
selector:@selector(backButtonDidClick)
imageNormal:[UIImage imageNamed:@"my_sezhi1"]
imageHightlighted:[UIImage imageNamed:@"my_sezhi1"]
titleColorNormal:[UIColor blueColor]
titleColorHightlighted:[UIColor redColor]
title:@"返回"
];
//右邊的item
self.navigationItem.rightBarButtonItem = [UIBarButtonItem jjRightItem:self
selector:@selector(collectionButtonDidClick)
imageNormal:[UIImage imageNamed:@"my_shoucang1"]
imageHightlighted:[UIImage imageNamed:@"my_shoucang1"]
imageDisabled:[UIImage imageNamed:@"my_shoucang1"]
titleColorNormal:[UIColor blueColor]
titleColorHightlighted:[UIColor redColor]
titleColorDisabled:[UIColor blackColor]
title:@"收藏"
];
}
#pragma mark - Action && Notification
- (void)backButtonDidClick
{
NSLog(@"返回按鈕");
}
- (void)collectionButtonDidClick
{
NSLog(@"收藏按鈕");
}
@end
下面我們看一下效果展示。
效果展示
這里文字大小我設置的是17號字體,里面定義的宏,想修改的直接修改宏就可以了。
#define kLeftTitleFont (17.0)
#define kRightTitleFont (17.0)
后記
希望我寫的這個小框架能對大家有所幫助,謝謝大家的關注~~,繼續努力。
冬