// // UIBarButtonItem+Extension.m // JWlive // // Created by pican zhang on 16/3/18. // Copyright © 2016年 pican zhang. All rights reserved. // #import "UIBarButtonItem+Extension.h" #import @implementation BackView - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; } return self; } -(void)layoutSubviews{ [super layoutSubviews]; UINavigationBar *navBar = nil; UIView *aView = self.superview; while (aView) { if ([aView isKindOfClass:[UINavigationBar class]]) { navBar = (UINavigationBar *)aView; break; } aView = aView.superview; } UINavigationItem * navItem = (UINavigationItem *)navBar.items.lastObject; UIBarButtonItem *leftItem = navItem.leftBarButtonItem; UIBarButtonItem *rightItem = navItem.rightBarButtonItem; if (rightItem) {//右边按钮 BackView *backView = rightItem.customView; if ([backView isKindOfClass:self.class]) { backView.btn.x = backView.frame.size.width -backView.btn.frame.size.width; } } if (leftItem) {//左边按钮 // BackView *backView = leftItem.customView; } } @end @implementation UIBarButtonItem (createBtnItem) + (instancetype)itemWithImage:(NSString *)image highImage:(NSString *)highImage target:(id)target action:(SEL)action{ return [self itemWithImage:image title:nil highImage:highImage contentEdge: UIEdgeInsetsMake(0,0,0,0)target:target action:(SEL)action]; } + (instancetype)itemWithImage:(NSString *)image title:(NSString *)title highImage:(NSString *)highImage contentEdge:(UIEdgeInsets)contentEdge target:(id)target action:(SEL)action{ UIButton *btn = [[UIButton alloc] init]; [btn setImage:[UIImage imageNamed:image] forState:(UIControlStateNormal)]; [btn setTitle:title forState:UIControlStateNormal]; [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; btn.titleLabel.font = [UIFont systemFontOfSize:14]; btn.frame = CGRectMake(0, 0, 44, 44); btn.contentEdgeInsets = contentEdge; btn.backgroundColor = [UIColor whiteColor]; [btn setEnlargeEdge:30]; [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; // UIView* containerView = [[UIView alloc]init]; // containerView.backgroundColor = [UIColor greenColor]; // [containerView addSubview:btn]; // if (contentEdge.right<0) { // containerView.frame = CGRectMake(-20, 0, 44, 44); // }else{ // containerView.frame = CGRectMake(20, 0, 44, 44); // } return [[UIBarButtonItem alloc] initWithCustomView:btn]; // BackView *customView = [[BackView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)]; // UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:target action:action]; // [customView addGestureRecognizer:tap]; // customView.btn = [UIButton buttonWithType:UIButtonTypeCustom]; // customView.btn.titleLabel.font = [UIFont systemFontOfSize:14.0]; // // customView.btn.contentEdgeInsets = contentEdge; // [customView.btn setImage:[UIImage imageNamed:image] forState:UIControlStateNormal]; // [customView.btn setImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted]; // [customView.btn setTitle:title forState:UIControlStateNormal]; // [customView.btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; // if (image) { // customView.btn.frame = CGRectMake(0, 0, customView.btn.currentImage.size.width, customView.btn.currentBackgroundImage.size.height); // }else{ // customView.btn.frame = CGRectMake(0, 0, 44, 44); // } // customView.btn.frame = customView.bounds; // customView.btn.centerY = customView.center.y; // [customView.btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; // [customView addSubview:customView.btn]; // return [[UIBarButtonItem alloc] initWithCustomView:customView]; } + (instancetype)itemWithFrame:(CGRect)frame Title:(NSString*)title titleFont:(UIFont*)font titleColor:(UIColor*)titleColor bkgColor:(UIColor*)bkgColor contentEdge:(UIEdgeInsets)contentEdge hasBorder:(BOOL)hasBorder borderBkgColor:(UIColor*)borderBkgColor target:(id)target action:(SEL)action{ UIButton *btn = [[UIButton alloc] initWithFrame:frame]; btn.backgroundColor = bkgColor; btn.titleLabel.textAlignment = UIBaselineAdjustmentAlignCenters; btn.titleLabel.font = font; [btn setTitle:title forState:(UIControlStateNormal)]; [btn setTitleColor:titleColor forState:(UIControlStateNormal)]; [btn setEnlargeEdgeWithTop:20 right:20 bottom:20 left:20]; // btn.contentEdgeInsets = contentEdge; if (hasBorder) { btn.layer.borderColor = borderBkgColor.CGColor; btn.layer.borderWidth = 1.0; btn.layer.cornerRadius = 4.0; btn.layer.masksToBounds = YES; } // btn.titleEdgeInsets = UIEdgeInsetsMake(0,0, 0,0); [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; return [[UIBarButtonItem alloc] initWithCustomView:btn]; } + (instancetype)itemWithFrame:(CGRect)frame Title:(NSString*)title titleFont:(UIFont*)font titleColor:(UIColor*)titleColor target:(id)target action:(SEL)action{ UIButton *btn = [[UIButton alloc] initWithFrame:frame]; btn.titleLabel.textAlignment = UIBaselineAdjustmentAlignCenters; btn.titleLabel.font = font; btn.layer.cornerRadius = 2.0; btn.layer.borderWidth = 1.0; btn.layer.borderColor = [UIColor whiteColor].CGColor; [btn setTitle:title forState:(UIControlStateNormal)]; [btn setTitleColor:titleColor forState:(UIControlStateNormal)]; [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; [btn setEnlargeEdgeWithTop:20 right:20 bottom:20 left:20]; return [[UIBarButtonItem alloc] initWithCustomView:btn]; } +(UIBarButtonItem *) text:(NSString *)text contentEdge:(UIEdgeInsets)contentEdge selector:(SEL)selecor target:(id)target { CGFloat width= [text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]}].width; UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, width, 30)]; [button setTitle:text forState:UIControlStateNormal]; button.titleLabel.font = [UIFont systemFontOfSize:15]; [button addTarget:target action:selecor forControlEvents:UIControlEventTouchUpInside]; // button.contentEdgeInsets = contentEdge; return [[UIBarButtonItem alloc] initWithCustomView:button]; } +(UIBarButtonItem *) icon:(NSString *)icon selector:(SEL)selecor target:(id)target { UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 32, 32)]; [button setImage:[UIImage imageNamed:icon] forState:UIControlStateNormal]; [button addTarget:target action:selecor forControlEvents:UIControlEventTouchUpInside]; return [[UIBarButtonItem alloc] initWithCustomView:button]; } +(UIBarButtonItem *) back:(NSString *)title selector:(SEL)selecor target:(id)target { CGFloat width= [title sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:18]}].width; UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, width, 30)]; [button setTitle:title forState:UIControlStateNormal]; button.titleLabel.font = [UIFont systemFontOfSize:18]; [button addTarget:target action:selecor forControlEvents:UIControlEventTouchUpInside]; [button setImage:[UIImage imageNamed:@"nav_back_normal"] forState:UIControlStateNormal]; [button setTitleEdgeInsets:UIEdgeInsetsMake(0, -5, 0, 0)]; [button setImageEdgeInsets:UIEdgeInsetsMake(1, -15, 0, 0)]; return [[UIBarButtonItem alloc] initWithCustomView:button]; } +(UIBarButtonItem*)itemWithImage:(NSString *)image title:(NSString *)title target:(id)target action:(SEL)action{ UIView *backView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 60, 44)]; UIButton *btn = [[UIButton alloc] init]; [btn setTitle:title forState:UIControlStateNormal]; [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; btn.titleLabel.font = [UIFont systemFontOfSize:12]; btn.frame = CGRectMake(0, 0, 47, 44); [btn setTitleEdgeInsets:UIEdgeInsetsMake(0, -8, 0, 0)]; // btn.lineBreakMode = NSLineBreakByTruncatingTail; [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; [backView addSubview:btn]; UIImageView *imgV = [[UIImageView alloc]initWithFrame:CGRectMake(42, 18, 13, 7)]; imgV.contentMode = UIViewContentModeScaleAspectFill; imgV.clipsToBounds = YES; imgV.image = [UIImage imageNamed:image]; [backView addSubview:imgV]; return [[UIBarButtonItem alloc] initWithCustomView:backView]; } NSString *const ZYBarButtonItem_hasBadgeKey = @"ZYBarButtonItem_hasBadgeKey"; NSString *const ZYBarButtonItem_badgeKey = @"ZYBarButtonItem_badgeKey"; NSString *const ZYBarButtonItem_badgeSizeKey = @"ZYBarButtonItem_badgeSizeKey"; NSString *const ZYBarButtonItem_badgeOriginXKey = @"ZYBarButtonItem_badgeOriginXKey"; NSString *const ZYBarButtonItem_badgeOriginYKey = @"ZYBarButtonItem_badgeOriginYKey"; NSString *const ZYBarButtonItem_badgeColorKey = @"ZYBarButtonItem_badgeColorKey"; @end @implementation UIBarButtonItem (Badge) @dynamic hasBadge; @dynamic badgeSize,badgeOriginX,badgeOriginY; - (void)initBadge { UIView *superview = nil; if (self.customView) { superview = self.customView; superview.clipsToBounds = NO; } else if ([self respondsToSelector:@selector(view)] && [(id)self view]) { superview = [(id)self view]; } [superview addSubview:self.badge]; // 默认设置 default configure self.badgeColor = [UIColor redColor]; self.badgeSize = 8; self.badgeOriginX = 26; self.badgeOriginY = 11; self.badge.hidden = YES; } - (void)showBadge { self.badge.hidden = NO; } - (void)hideBadge { self.badge.hidden = YES; } - (void)refreshBadge { self.badge.frame = (CGRect){self.badgeOriginX,self.badgeOriginY,self.badgeSize,self.badgeSize}; self.badge.backgroundColor = self.badgeColor; self.badge.layer.cornerRadius = self.badgeSize/2; } #pragma mark ---------- badge getter & setter function ----------- - (UIView *)badge { UIView *badge = (UIView *)objc_getAssociatedObject(self, &ZYBarButtonItem_badgeKey); if (!badge) { badge = [[UIView alloc] init]; [self setBadge:badge]; [self initBadge]; } return badge; } - (void)setBadge:(UIView *)badge { objc_setAssociatedObject(self, &ZYBarButtonItem_badgeKey, badge, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (UIColor *)badgeColor { return objc_getAssociatedObject(self, &ZYBarButtonItem_badgeColorKey); } - (void)setBadgeColor:(UIColor *)badgeColor { objc_setAssociatedObject(self, &ZYBarButtonItem_badgeColorKey, badgeColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC); if (self.badge) { [self refreshBadge]; } } -(CGFloat)badgeSize { NSNumber *number = objc_getAssociatedObject(self, &ZYBarButtonItem_badgeSizeKey); return number.floatValue; } -(void)setBadgeSize:(CGFloat)badgeSize { NSNumber *number = [NSNumber numberWithDouble:badgeSize]; objc_setAssociatedObject(self, &ZYBarButtonItem_badgeSizeKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC); if (self.badge) { [self refreshBadge]; } } -(CGFloat)badgeOriginX { NSNumber *number = objc_getAssociatedObject(self, &ZYBarButtonItem_badgeOriginXKey); return number.floatValue; } -(void)setBadgeOriginX:(CGFloat)badgeOriginX { NSNumber *number = [NSNumber numberWithDouble:badgeOriginX]; objc_setAssociatedObject(self, &ZYBarButtonItem_badgeOriginXKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC); if (self.badge) { [self refreshBadge]; } } -(CGFloat)badgeOriginY { NSNumber *number = objc_getAssociatedObject(self, &ZYBarButtonItem_badgeOriginYKey); return number.floatValue; } -(void)setBadgeOriginY:(CGFloat)badgeOriginY { NSNumber *number = [NSNumber numberWithDouble:badgeOriginY]; objc_setAssociatedObject(self, &ZYBarButtonItem_badgeOriginYKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC); if (self.badge) { [self refreshBadge]; } } - (void)setHasBadge:(BOOL)hasBadge { if (hasBadge) { [self showBadge]; }else{ [self hideBadge]; } NSNumber *number = [NSNumber numberWithBool:hasBadge]; objc_setAssociatedObject(self, &ZYBarButtonItem_hasBadgeKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (BOOL)hasBadge { NSNumber *number = objc_getAssociatedObject(self, &ZYBarButtonItem_hasBadgeKey); return number.boolValue; } @end