首先列荔,很尷尬敬尺、失落的吐槽一下:本菜鳥不知道怎么上傳GIF,所以效果圖只能用圖片簡(jiǎn)單描述。
先簡(jiǎn)單描述需求:
1贴浙、最常見的股票效果砂吞,左右滑動(dòng),上下滾動(dòng)崎溃。
2呜舒、課程表效果,左邊固定第幾節(jié)課笨奠,右邊就是星期一到星期日的課程,可以左右滑動(dòng)唤殴。
3般婆、商家應(yīng)用App,實(shí)現(xiàn)計(jì)算收入的左右滑動(dòng)朵逝,類似Excel表格蔚袍。
即:實(shí)現(xiàn)一張列表,左邊的欄目固定,右邊能夠上下左右滑動(dòng)配名,重點(diǎn)是頭部也能隨著滑動(dòng)而滑動(dòng)啤咽。
扯淡一下:
1:網(wǎng)上你能看到的都是(大部分)都是用兩個(gè)UITableView+UIScrollView實(shí)現(xiàn)的宇整。
這樣導(dǎo)致第一張圖片1的視圖很難實(shí)現(xiàn),達(dá)不到跟隨滑動(dòng)而滑動(dòng)芋膘。你還要糾結(jié)怎么下滑刷新鳞青、上拉加載更多霸饲。
2:兩個(gè)UITableView的實(shí)現(xiàn)大概是這樣的:名稱代碼那一列是一個(gè)UITableView,后面那些值是一個(gè)UITableView臂拓。當(dāng)然懸浮在最上面的那一行是UIScrollView實(shí)現(xiàn)的厚脉,我的也是 . . .
3:代碼多敲敲、多看看胶惰、多對(duì)比傻工,才是自己的東西,也才能知道問題在哪里孵滞。
本文實(shí)現(xiàn)思路:
問題來了:
1:滑動(dòng)cell的UIScrollView中捆,怎么實(shí)現(xiàn)全部的cell都跟著左右滑動(dòng)、還有最新價(jià)那一行也左右滑動(dòng)?
2:最新價(jià)所在行滑動(dòng)剃斧,那么下面內(nèi)容視圖cell轨香,咋么也跟著左右滑動(dòng)?
本菜鳥琢磨了很久幼东,最終用通知實(shí)現(xiàn)了臂容,下面直接貼關(guān)鍵代碼了,
道理就是:我在滑動(dòng)了根蟹,通知你也要滑動(dòng)了脓杉。然后就實(shí)現(xiàn)了 . . .
// 在控制器中注冊(cè)一個(gè)通知,
// 目的就是我滑動(dòng)了简逮,發(fā)出通知告訴對(duì)方也要跟著滑動(dòng)了
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollMove:) name:tapCellScrollNotification object:nil];
控制器中UIScrollView的代理方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//cell上的UIScrollView滑動(dòng)了viewForHeader上的UIScrollView跟著滑動(dòng)
if ([scrollView isEqual:self.topScrollView]) {
CGPoint offSet = _aroundCell.rightScrollView.contentOffset;
offSet.x = scrollView.contentOffset.x;
_aroundCell.rightScrollView.contentOffset = offSet;
}
//viewForHeader上的UIScrollView滑動(dòng)了球散,發(fā)出通知告訴cell上的UIScrollView也要滑動(dòng)了
if ([scrollView isEqual:self.myTableView]) {
// 發(fā)送通知
[[NSNotificationCenter defaultCenter] postNotificationName:tapCellScrollNotification object:self userInfo:@{@"cellOffX":@(self.cellLastX)}];
}
}
注冊(cè)通知實(shí)現(xiàn)的方法
cell滑動(dòng)了多少,viewForHeader也要跟著滑動(dòng)多少
-(void)scrollMove:(NSNotification*)notification
{
NSDictionary *noticeInfo = notification.userInfo;
NSObject *obj = notification.object;
float x = [noticeInfo[@"cellOffX"] floatValue];
self.cellLastX = x;
CGPoint offSet = self.topScrollView.contentOffset;
offSet.x = x;
self.topScrollView.contentOffset = offSet;
obj = nil;
}
接下來就是處理cell
//給cell上的UIScrollView添加點(diǎn)擊事件散庶、注冊(cè)通知(目的跟控制器的通知一樣樣)
UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
[self.rightScrollView addGestureRecognizer:tapGes];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollMove:) name:tapCellScrollNotification object:nil];
//cell中UIScrollView的代理事件
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
if (!_isNotification) {
// 發(fā)送通知
[[NSNotificationCenter defaultCenter] postNotificationName:tapCellScrollNotification object:self userInfo:@{@"cellOffX":@(scrollView.contentOffset.x)}];
}
_isNotification = NO;
}
剛才我們給cell的UIScrollView添加了事件蕉堰,目的是告訴控制器我點(diǎn)擊了第幾行,控制器去做其他動(dòng)作悲龟。
并且我們擔(dān)心他的觸發(fā)事件跟其他的觸發(fā)事件沖突屋讶,我要要做一個(gè)手勢(shì)觸發(fā)判斷是不是我們加上去的,還是UITableViewCellContentView的事件
- (void)tapAction:(UITapGestureRecognizer *)gesture
{
if (self.tapCellClick) {
self.tapCellClick(indexPath);
}
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
}
return YES;
}
大概思路以及重要代碼都在上面了须教。
還是那句話:代碼多敲敲皿渗、多看看、多對(duì)比轻腺,才是自己的東西乐疆,也才能知道問題在哪里。
如果有什么不明白贬养,歡迎一起研究挤土、共勉。
Demo下載地址误算,歡迎stars --> AroundVC
歡迎大神多多指教耕挨,不勝感激细卧,謝謝。