前言
在項(xiàng)目中遇到了許多報(bào)表格仲,雖然目前只是一個(gè)簡(jiǎn)單的展示,可以用tableView單元格顯示诵冒,滿足目前的需求抓狭,但是我仔細(xì)考慮了,能不能實(shí)現(xiàn)類似Excel表那樣展示造烁,既可以左右滑動(dòng),又可以上下滑動(dòng)午笛,當(dāng)時(shí)找了許多資料惭蟋,也找了許多國(guó)外網(wǎng)站的資料,卻找不到這樣類似的開源項(xiàng)目药磺,不過后面在code4app發(fā)現(xiàn)了UITableViewLinkageDemo告组,但是仔細(xì)研究代碼后,發(fā)現(xiàn)其內(nèi)部復(fù)用性是個(gè)問題同時(shí)不能支持上下拉刷新等癌佩,后面在github這個(gè)demo的作者提了一些我的想法木缝,最終我決定自己去實(shí)現(xiàn)一個(gè)類似Excel的控件,因此結(jié)合UITableViewLinkageDemo的思想围辙,去摸索我碟,最終實(shí)現(xiàn)了這樣的控件--YWExcel。
YWTableExcel 相對(duì)YWExcel 使用更加方便和api更豐富https://github.com/flyOfYW/YWTableExcel
效果圖
一 整體描述圖
1姚建、紅色部分為:UITableView
2 藍(lán)色部分:UITableViewCell
3 黃色部分:UISrollView
4 類目那一行:目前設(shè)置2個(gè)模式
1)作為獨(dú)立tableView之上的view
2)作為tableView的組頭View
二 設(shè)計(jì)聯(lián)動(dòng)的思路
在 -(void)scrollViewDidScroll:(UIScrollView *)scrollView
監(jiān)聽偏移量矫俺,去改變其他scrollView的偏移量,那么采用什么方式去改變其他的偏移量呢掸冤,三種方式:block厘托、delegate,NSNotificationCenter
最初的時(shí)候稿湿,我使用了block铅匹,但是發(fā)現(xiàn)并沒實(shí)現(xiàn)我想要的那種效果,后來我就重新梳理下思路饺藤,scrollView添加在cell上包斑,但是cell是多個(gè)流礁,想一個(gè)cell上的scrollView改變偏移量,同時(shí)能改變其他cell上的scrollView的偏移量的這樣場(chǎng)景下(一對(duì)多的關(guān)系)舰始,就使用NSNotificationCenter的方法去實(shí)現(xiàn)聯(lián)動(dòng)
注意點(diǎn):使用NSNotificationCenter的第一個(gè)版本崇棠,效果確實(shí)出來,但是遇到一個(gè)bug丸卷,因?yàn)楫?dāng)時(shí)使用的通知名稱是寫”死“ 如:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollMove:) name:@"cellNotification" object:nil];
這樣就會(huì)造成一個(gè)界面有多個(gè)表格(YWExcelView的對(duì)象)的情況下枕稀,就會(huì)造成通知混亂。
因此谜嫉,現(xiàn)在這個(gè)版本萎坷,使用當(dāng)前對(duì)象的指針地址作為通知中的name
_NotificationID = [NSString stringWithFormat:@"%p",self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollMove:) name:_NotificationID object:nil];
這樣就可以確保每個(gè)YWExcelView的對(duì)象的通知中心都是獨(dú)立的,互不影響
三 使用方法
跟tableView的用法差不多
typedef NS_ENUM(NSInteger, YWExcelViewStyle) {
YWExcelViewStyleDefalut = 0,//整體表格滑動(dòng)沐兰,上下哆档、左右均可滑動(dòng)(除第一列不能左右滑動(dòng)以及頭部View不能上下滑動(dòng)外)
YWExcelViewStylePlain,//整體表格滑動(dòng),上下住闯、左右均可滑動(dòng)(除第一行不能上下滑動(dòng)以及頭部View不能上下滑動(dòng)外)
YWExcelViewStyleheadPlain,//整體表格(包括頭部View)滑動(dòng)瓜浸,上下、左右均可滑動(dòng)(除第一列不能左右滑動(dòng)外)
YWExcelViewStyleheadScrollView,//整體表格(包括頭部View)滑動(dòng)比原,上下插佛、左右均可滑動(dòng)
};
@protocol YWExcelViewDataSource<NSObject>
@required
//多少行
- (NSInteger)excelView:(YWExcelView *)excelView numberOfRowsInSection:(NSInteger)section;
//多少列
- (NSInteger)itemOfRow:(YWExcelView *)excelView;
@optional
- (void)excelView:(YWExcelView *)excelView label:(UILabel *)label textAtIndexPath:(YWIndexPath *)indexPath;
- (void)excelView:(YWExcelView *)excelView headView:(UILabel *)label textAtIndexPath:(YWIndexPath *)indexPath;
//分組
- (NSInteger)numberOfSectionsInExcelView:(YWExcelView *)excelView;
@end
@protocol YWExcelViewDelegate <NSObject>
@optional
//自定義每列的寬度/默認(rèn)每列的寬度為80
- (NSArray *)widthForItemOnExcelView:(YWExcelView *)excelView;
@end