這個Demo是在日常開發(fā)中的一個需求抽出來的,每個項目都要自己的需求,所以本文只是提供一些思路,如果你的項目也有類似的需求,你也可以直接用我的方法來做。
Demo的GitHub地址:[GitHub](https://github.com/attackFromCat/LXBreadcrumbNavigation)
項目效果:

首先談?wù)勎业捻椖啃枨笫窃鯓拥模覀兊捻椖渴且豢钷k公協(xié)同App,需要管理公司的部門結(jié)構(gòu)或者是行政機(jī)構(gòu),所以我們的項目提供自行創(chuàng)建部門,例如,一個公司分幾個機(jī)構(gòu),一個機(jī)構(gòu)又分為幾個部門,部門里面又有不同的小組等。那么面包屑導(dǎo)航就能在相關(guān)管理者管理層級結(jié)構(gòu),或者公司員工查找人員就能起到導(dǎo)向作用。
現(xiàn)在來談?wù)剬崿F(xiàn)的思路,導(dǎo)航欄可以繼承UIView或者UITableViewCell都可以,不過如果繼承UITableViewCell可能就會在以后UITableView的顯示帶來一些小麻煩,需要判斷cell的展示,所以就采用繼承UIView,然后把它設(shè)置為UITableView的HeaderView,這樣也能到達(dá)我們的效果。
#import <UIKit/UIKit.h>
@interface LXBreadcrumbView : UIView
/**
面包屑導(dǎo)航展示的數(shù)組
*/
@property (nonatomic, strong) NSMutableArray *crumbs;
/**
點擊面包屑導(dǎo)航傳出被點擊的按鈕的Tag值,可以在block中進(jìn)行其他操作
*/
@property (nonatomic, strong) void(^clickBlock)(NSInteger);
@end
通過傳入的數(shù)組去創(chuàng)建需要多少個按鈕,由于我們服務(wù)器會幫我們傳回每個點擊后的父子層級關(guān)系,所以就采用數(shù)組來記錄點擊的路徑。
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
// 給面包屑View添加一個內(nèi)容滾動視圖,以滿足超過屏幕寬度的情況下可以左右滑動
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScrollViewHeight)];
scrollView.showsHorizontalScrollIndicator = NO;
[self addSubview:scrollView];
_scrollView = scrollView;
self.backgroundColor = [UIColor colorWithRed:0.922 green:0.929 blue:0.941 alpha:1.000];
_btnArray = [NSMutableArray array];
}
return self;
}
剩下就是根據(jù)外界傳入的數(shù)組來創(chuàng)建標(biāo)題按鈕并進(jìn)行相應(yīng)的初始化,比較常規(guī)就不多說了,就是在計算它們的x值得時候。
//利用此方法獲得前一個空間的最大x值
maxX = CGRectGetMaxX(btn.frame) + margin;
來說說在這個Demo中的是如何使用的這個小部件的,首先我的頭文件中定義了個屬性,方便重用這個控制器。
@interface ViewController : UIViewController
@property (nonatomic, strong) NSString *titleStr; // 傳入進(jìn)來的主題
@end
點擊cell進(jìn)入這個方法,因為沒有服務(wù)器給我傳值,所以我就在這個方法弄了一點假數(shù)據(jù),然后點擊后隨機(jī)產(chǎn)生主題傳入準(zhǔn)備push的控制器。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSArray *crumbList = @[
@"新聞",@"體育",@"足球",@"國際足球",@"西甲",@"皇家馬德里"
];
ViewController *vc = [[ViewController alloc] init];
int value = arc4random_uniform(6);
vc.titleStr = crumbList[value];
// 記錄面包路徑數(shù)組,存入沙盒,模擬從服務(wù)器獲取數(shù)據(jù)
_crumbList = [self getCrumbListData];
[_crumbList addObject:vc.titleStr];
[self saveCrumbListData];
[self.navigationController pushViewController:vc animated:YES];
}
最后就是實現(xiàn)面包屑的block就完成了,請看下面的代碼。
__weak __typeof(self) weakSelf = self;
[_crumView setClickBlock:^(NSInteger btnTag) {
// 將導(dǎo)航控制器棧的控制拷貝下來
NSMutableArray *arr = weakSelf.navigationController.viewControllers.mutableCopy;
// 根據(jù)按鈕傳回來的Tag值找到該Tag對應(yīng)的控制器,然后把之后的控制器刪除
[arr removeObjectsInRange:NSMakeRange(btnTag + 1, arr.count - btnTag - 1)];
// 刪除數(shù)組多余的數(shù)據(jù)
weakSelf.crumbList = [weakSelf getCrumbListData];
[weakSelf.crumbList removeObjectsInRange:NSMakeRange(btnTag + 1, weakSelf.crumbList.count - btnTag - 1)];
[weakSelf saveCrumbListData];
// push或pop到棧頂控制器
[weakSelf.navigationController setViewControllers:arr animated:YES];
}];
如果你們服務(wù)器兄弟幫你解決了關(guān)系層級問題,那就可輕松多了。我也不知道還要說些什么,第一次寫這種文章,還有很多不知道怎么去說,有問題可以在GitHub上push我或者在這給我留言,我會盡力去解決,也希望大家相互學(xué)習(xí)。