//
|
// LMJNavigationBar.m
|
// PLMMPRJK
|
//
|
// Created by NJHu on 2017/3/31.
|
// Copyright © 2017年 GoMePrjk. All rights reserved.
|
//
|
|
#import "LMJNavigationBar.h"
|
|
|
#define kStatusBarHeight [UIApplication sharedApplication].statusBarFrame.size.height
|
|
#define kDefaultNavBarHeight ([UIApplication sharedApplication].statusBarFrame.size.height + 44.0)
|
|
#define kSmallTouchSizeHeight 44.0
|
|
#define kLeftRightViewSizeMinWidth 60.0
|
|
#define kLeftMargin 0.0
|
|
#define kRightMargin 0.0
|
|
#define kNavBarCenterY(H) ((self.frame.size.height - kStatusBarHeight - H) * 0.5 + kStatusBarHeight)
|
|
#define kViewMargin 5.0
|
|
@implementation LMJNavigationBar
|
|
|
#pragma mark - system
|
|
- (instancetype)initWithFrame:(CGRect)frame
|
{
|
if (self = [super initWithFrame:frame]) {
|
[self setupLMJNavigationBarUIOnce];
|
}
|
return self;
|
}
|
|
- (void)awakeFromNib
|
{
|
[super awakeFromNib];
|
[self setupLMJNavigationBarUIOnce];
|
}
|
|
|
|
- (void)layoutSubviews
|
{
|
[super layoutSubviews];
|
|
[self.superview bringSubviewToFront:self];
|
|
self.leftView.frame = CGRectMake(0, kStatusBarHeight, self.leftView.lmj_width, self.leftView.lmj_height);
|
|
self.rightView.frame = CGRectMake(self.lmj_width - self.rightView.lmj_width, kStatusBarHeight, self.rightView.lmj_width, self.rightView.lmj_height);
|
|
self.titleView.frame = CGRectMake(0, kStatusBarHeight + (44.0 - self.titleView.lmj_height) * 0.5, MIN(self.lmj_width - MAX(self.leftView.lmj_width, self.rightView.lmj_width) * 2 - kViewMargin * 2, self.titleView.lmj_width), self.titleView.lmj_height);
|
|
self.titleView.lmj_x = (self.lmj_width * 0.5 - self.titleView.lmj_width * 0.5);
|
|
self.bottomBlackLineView.frame = CGRectMake(0, self.lmj_height, self.lmj_width, 0.5);
|
|
}
|
|
|
|
#pragma mark - Setter
|
- (void)setTitleView:(UIView *)titleView
|
{
|
[_titleView removeFromSuperview];
|
[self addSubview:titleView];
|
|
_titleView = titleView;
|
|
__block BOOL isHaveTapGes = NO;
|
|
[titleView.gestureRecognizers enumerateObjectsUsingBlock:^(__kindof UIGestureRecognizer * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
|
|
if ([obj isKindOfClass:[UITapGestureRecognizer class]]) {
|
|
isHaveTapGes = YES;
|
|
*stop = YES;
|
}
|
}];
|
|
if (!isHaveTapGes) {
|
|
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(titleClick:)];
|
|
[titleView addGestureRecognizer:tap];
|
}
|
|
|
[self layoutIfNeeded];
|
}
|
|
|
|
|
- (void)setTitle:(NSMutableAttributedString *)title
|
{
|
// bug fix
|
if ([self.dataSource respondsToSelector:@selector(lmjNavigationBarTitleView:)] && [self.dataSource lmjNavigationBarTitleView:self]) {
|
return;
|
}
|
|
/**头部标题*/
|
UILabel *navTitleLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, self.lmj_width * 0.4, 44)];
|
|
navTitleLabel.numberOfLines=0;//可能出现多行的标题
|
[navTitleLabel setAttributedText:title];
|
navTitleLabel.textAlignment = NSTextAlignmentCenter;
|
navTitleLabel.backgroundColor = [UIColor clearColor];
|
navTitleLabel.userInteractionEnabled = YES;
|
navTitleLabel.lineBreakMode = NSLineBreakByClipping;
|
|
self.titleView = navTitleLabel;
|
}
|
|
|
- (void)setLeftView:(UIView *)leftView
|
{
|
[_leftView removeFromSuperview];
|
|
[self addSubview:leftView];
|
|
_leftView = leftView;
|
|
|
if ([leftView isKindOfClass:[UIButton class]]) {
|
|
UIButton *btn = (UIButton *)leftView;
|
|
[btn addTarget:self action:@selector(leftBtnClick:) forControlEvents:UIControlEventTouchUpInside];
|
}
|
|
[self layoutIfNeeded];
|
|
}
|
|
|
- (void)setBackgroundImage:(UIImage *)backgroundImage
|
{
|
_backgroundImage = backgroundImage;
|
|
self.layer.contents = (id)backgroundImage.CGImage;
|
}
|
|
|
|
- (void)setRightView:(UIView *)rightView
|
{
|
[_rightView removeFromSuperview];
|
|
[self addSubview:rightView];
|
|
_rightView = rightView;
|
|
if ([rightView isKindOfClass:[UIButton class]]) {
|
|
UIButton *btn = (UIButton *)rightView;
|
|
[btn addTarget:self action:@selector(rightBtnClick:) forControlEvents:UIControlEventTouchUpInside];
|
}
|
|
[self layoutIfNeeded];
|
}
|
|
|
|
- (void)setDataSource:(id<LMJNavigationBarDataSource>)dataSource
|
{
|
_dataSource = dataSource;
|
|
[self setupDataSourceUI];
|
}
|
|
|
#pragma mark - getter
|
|
- (UIView *)bottomBlackLineView
|
{
|
if(!_bottomBlackLineView)
|
{
|
CGFloat height = 0.5;
|
UIView *bottomBlackLineView = [[UIView alloc] initWithFrame:CGRectMake(0, self.frame.size.height , self.frame.size.width, height)];
|
[self addSubview:bottomBlackLineView];
|
_bottomBlackLineView = bottomBlackLineView;
|
bottomBlackLineView.backgroundColor = [UIColor lightGrayColor];
|
}
|
return _bottomBlackLineView;
|
}
|
|
#pragma mark - event
|
|
- (void)leftBtnClick:(UIButton *)btn
|
{
|
if ([self.lmjDelegate respondsToSelector:@selector(leftButtonEvent:navigationBar:)]) {
|
|
[self.lmjDelegate leftButtonEvent:btn navigationBar:self];
|
|
}
|
|
}
|
|
|
- (void)rightBtnClick:(UIButton *)btn
|
{
|
if ([self.lmjDelegate respondsToSelector:@selector(rightButtonEvent:navigationBar:)]) {
|
|
[self.lmjDelegate rightButtonEvent:btn navigationBar:self];
|
|
}
|
|
}
|
|
|
-(void)titleClick:(UIGestureRecognizer*)Tap
|
{
|
UILabel *view = (UILabel *)Tap.view;
|
if ([self.lmjDelegate respondsToSelector:@selector(titleClickEvent:navigationBar:)]) {
|
|
[self.lmjDelegate titleClickEvent:view navigationBar:self];
|
|
}
|
}
|
|
|
|
#pragma mark - custom
|
|
- (void)setupDataSourceUI
|
{
|
|
/** 导航条的高度 */
|
|
if ([self.dataSource respondsToSelector:@selector(lmjNavigationHeight:)]) {
|
|
self.lmj_size = CGSizeMake(kScreenWidth, [self.dataSource lmjNavigationHeight:self]);
|
|
}else
|
{
|
self.lmj_size = CGSizeMake(kScreenWidth, kDefaultNavBarHeight);
|
}
|
|
/** 是否显示底部黑线 */
|
if ([self.dataSource respondsToSelector:@selector(lmjNavigationIsHideBottomLine:)]) {
|
|
if ([self.dataSource lmjNavigationIsHideBottomLine:self]) {
|
self.bottomBlackLineView.hidden = YES;
|
}
|
|
}
|
|
/** 背景图片 */
|
if ([self.dataSource respondsToSelector:@selector(lmjNavigationBarBackgroundImage:)]) {
|
|
self.backgroundImage = [self.dataSource lmjNavigationBarBackgroundImage:self];
|
}
|
|
/** 背景色 */
|
if ([self.dataSource respondsToSelector:@selector(lmjNavigationBackgroundColor:)]) {
|
self.backgroundColor = [self.dataSource lmjNavigationBackgroundColor:self];
|
}
|
|
|
/** 导航条中间的 View */
|
if ([self.dataSource respondsToSelector:@selector(lmjNavigationBarTitleView:)]) {
|
|
self.titleView = [self.dataSource lmjNavigationBarTitleView:self];
|
|
}else if ([self.dataSource respondsToSelector:@selector(lmjNavigationBarTitle:)])
|
{
|
/**头部标题*/
|
self.title = [self.dataSource lmjNavigationBarTitle:self];
|
}
|
|
|
/** 导航条的左边的 view */
|
/** 导航条左边的按钮 */
|
if ([self.dataSource respondsToSelector:@selector(lmjNavigationBarLeftView:)]) {
|
|
self.leftView = [self.dataSource lmjNavigationBarLeftView:self];
|
|
}else if ([self.dataSource respondsToSelector:@selector(lmjNavigationBarLeftButtonImage:navigationBar:)])
|
{
|
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, kSmallTouchSizeHeight, kSmallTouchSizeHeight)];
|
|
btn.titleLabel.font = [UIFont systemFontOfSize:16];
|
|
UIImage *image = [self.dataSource lmjNavigationBarLeftButtonImage:btn navigationBar:self];
|
|
if (image) {
|
[btn setImage:image forState:UIControlStateNormal];
|
}
|
|
self.leftView = btn;
|
}
|
|
/** 导航条右边的 view */
|
/** 导航条右边的按钮 */
|
if ([self.dataSource respondsToSelector:@selector(lmjNavigationBarRightView:)]) {
|
|
self.rightView = [self.dataSource lmjNavigationBarRightView:self];
|
|
}else if ([self.dataSource respondsToSelector:@selector(lmjNavigationBarRightButtonImage:navigationBar:)])
|
{
|
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, kLeftRightViewSizeMinWidth, kSmallTouchSizeHeight)];
|
|
btn.titleLabel.font = [UIFont systemFontOfSize:16];
|
|
UIImage *image = [self.dataSource lmjNavigationBarRightButtonImage:btn navigationBar:self];
|
|
if (image) {
|
[btn setImage:image forState:UIControlStateNormal];
|
}
|
|
self.rightView = btn;
|
}
|
|
}
|
|
|
- (void)setupLMJNavigationBarUIOnce
|
{
|
self.backgroundColor = [UIColor whiteColor];
|
}
|
|
|
@end
|