之前在寫一個類似于Excel表格頁面時乏梁,一種方式是可以實現(xiàn)可以上下左右及斜角聯(lián)動谁不,另一種方式只可以上下左右聯(lián)動剑梳。之所以提及這兩種方式主要是在開發(fā)過程中第一種遇到了內(nèi)存占用大問題搞隐,所以最終用了第二種方式實現(xiàn)Excel表格頁面匙睹。 Demo傳送門国夜,若有實現(xiàn)同樣需求的可以作為參考呢诬。
思路:
第一種方式:左邊用一個搭一個tableView顯示每行標題庶近,頂部物料編碼用一個UIView顯示赞庶,頂部用一個collectionView填列標題训挡,中間用一個srollerView再將tableview放其上填滿
#pragma mark - 右側(cè)詳情頁面
- (void)loadDetailView {
_detailScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(kAverageTableViewWidth, topConllectionCellH, kAverageTableViewWidth*2, kScreenHeight)];
_detailScrollView.tag = DetailScrollViewTag;
_detailScrollView.bounces = false;
_detailScrollView.delegate = self;
_detailScrollView.showsVerticalScrollIndicator = false;
_detailScrollView.showsHorizontalScrollIndicator = false;
_detailScrollView.contentSize = CGSizeMake(7*kAverageTableViewWidth, self.systransInquirystockArrays.count*rowHight);
_detailScrollView.backgroundColor = [UIColor grayColor];
_detailTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, kAverageTableViewWidth*7, self.systransInquirystockArrays.count*rowHight) style:UITableViewStylePlain];
_detailTableView.dataSource = self;
_detailTableView.delegate = self;
_detailTableView.tag = MidTableViewTag;
_detailTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.view addSubview:_detailScrollView];
[_detailScrollView addSubview:_detailTableView];
}
上面代碼主要是中間詳情的內(nèi)容視圖,因為我這里的有七列歧强,所以將scrollerView 的滾動范圍設(shè)成
_detailScrollView.contentSize = CGSizeMake(7*kAverageTableViewWidth, self.systransInquirystockArrays.count*rowHight);
寬為七列寬澜薄,高度為請求回來的數(shù)組有多少數(shù)組將其成以設(shè)定tableViewCell的高度有多少。同時將tableView Frame設(shè)置成等同于scrollerView的尺寸,四個控件在代理方法拖拽的處理如下:
/**
判斷拖動的view的tag進行聯(lián)動
*/
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (_currentScrollViewTag == TitleTableViewTag) {
CGFloat offSetX = _beforeScrollViewTag == TopIconListViewTag ? _topIconListView.contentOffset.x : _detailScrollView.contentOffset.x;
_detailScrollView.contentOffset = CGPointMake(offSetX, _titleTableView.contentOffset.y);
_topIconListView.contentOffset = CGPointMake(offSetX, 0);
return;
}
if (_currentScrollViewTag == DetailScrollViewTag) {
_titleTableView.contentOffset = CGPointMake(0, _detailScrollView.contentOffset.y);
_topIconListView.contentOffset = CGPointMake(_detailScrollView.contentOffset.x, 0);
return;
}
if (_currentScrollViewTag == TopIconListViewTag) {
CGFloat offSetY = _beforeScrollViewTag == TitleTableViewTag ? _titleTableView.contentOffset.y : _detailScrollView.contentOffset.y;
_detailScrollView.contentOffset = CGPointMake(_topIconListView.contentOffset.x, offSetY);
_titleTableView.contentOffset = CGPointMake(0, _detailScrollView.contentOffset.y);
return;
}
}
可以看到中間詳情tableView在代理方法中沒做任何處理摊册,詳情tableView是跟隨著scrollerView動的肤京。
這樣就實現(xiàn)了拖拽上下左右及斜角方向時四個控件的聯(lián)動聯(lián)動。但這樣有不足之處茅特,當請求下來的數(shù)據(jù)不大時還好忘分,但行數(shù)一旦達到上千行時,明顯內(nèi)存會占用很大
可以對比兩圖第一種方式當我 加載大量數(shù)據(jù)時白修,相對于第二種方式出現(xiàn)了嚴重的內(nèi)存占用問題妒峦。起初沒發(fā)覺是因為我加載的數(shù)據(jù)不多,當有人出現(xiàn)全查時就會有這種情況出現(xiàn)熬荆,我檢查了內(nèi)存是否存在泄漏及cell的復用的情況都沒問題舟山,但仔細看代碼才發(fā)現(xiàn)我這種方案是有問題的,因為我把中間詳情tableView的Frame設(shè)置成等同于scrollerView的尺寸卤恳,當全查時即高度等于cell的高度乘以1000累盗,當加載tableView時把全部cell加載出來,每個cell有近10個對象創(chuàng)建突琳,將相當于上萬個對象在占用內(nèi)存若债,當滑動到最后一個時才會啟用cell的回收機制,還好都是一些label拆融,若是每個cell中有圖片后果可想而知蠢琳。
第二種方式:同樣是搭建如上所搭建的方式啊终,但srollerView的滑動范圍改成如下
_detailScrollView.contentSize = CGSizeMake(7*kAverageTableViewWidth, kScreenHeight);
中間詳情的tableview的Frame改成如下:
_detailTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, kAverageTableViewWidth*7, kScreenHeight)
拖拽的策略改成如下:
/**
判斷拖動的view的tag進行聯(lián)動
*/
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (_currentScrollViewTag == TitleTableViewTag) {
//上一次點的是頭部視圖,內(nèi)容試圖的偏移量等于頭部視圖的偏移量,不然內(nèi)容視圖的偏移量等于本身的偏移量
CGFloat offSetTableViewX = _beforeScrollViewTag == TopIconListViewTag ? _topIconListView.contentOffset.x : _detailTableView.contentOffset.x;
_detailTableView.contentOffset = CGPointMake(offSetTableViewX, _titleTableView.contentOffset.y);
return;
}
if (_currentScrollViewTag == MidTableViewTag) {
_titleTableView.contentOffset = CGPointMake(0, _detailTableView.contentOffset.y);
return;
}
if (_currentScrollViewTag == DetailScrollViewTag) {
_topIconListView.contentOffset = CGPointMake(_detailScrollView.contentOffset.x, 0);
return;
}
}
當前拖拽中間詳情tableview時傲须,若是上下方向蓝牲,識別的是中間詳情的tableview,偏移量賦給左邊行標題的tableview泰讽,若是左右方向時例衍,識別的是tableview下的scrollerView的偏移量賦給頭部的collectionView。當點擊左邊行標題的tableview如上代碼注釋已卸。
這樣的方案只創(chuàng)建看得見的cell佛玄,cell消失后就會啟動cell的復用機制,所以內(nèi)存不會怎么占用累澡。但這樣斜角拖拽方向沒有實現(xiàn)梦抢。但上面最終竟然認可第二種方案,原因是斜角拖拽會有一種錯亂感愧哟,雖然就這樣去解決不是很好奥吩,以后再嘗試在即保證內(nèi)存優(yōu)化的情況下實現(xiàn)第一種方式的excel表格吧。能力有限翅雏,有錯求指正圈驼。