之前寫過(guò)類似的(http://www.reibang.com/p/b867ed4ee9e3),這里就當(dāng)溫故而知新吧鬼店!
功能
一個(gè)tableView上的某個(gè)cell(后面用cellA代替)上有一個(gè)scrollView滋戳,該scrollView上添加了幾個(gè)tableView痊土。要求在cellA所在的section的sectionHeader滑動(dòng)到頂部的時(shí)候cellA上的scrollView上的幾個(gè)tableView可以滑動(dòng)信姓,否則不能滑動(dòng)济赎。
想要的效果
最初的效果
解決思路
1.需要底部的tableView能夠同時(shí)響應(yīng)多個(gè)手勢(shì)(這樣在滑動(dòng)子tableView時(shí)候惊畏,底部的tableView也能滑動(dòng))
注:UITableView默認(rèn)是不能響應(yīng)多個(gè)手勢(shì)的扰法。在OC中我們只需創(chuàng)建一個(gè)繼承自UITableView的子類,并在該子類中重寫shouldRecognizeSimultaneouslyWithGestureRecognizer方法即可衅鹿。在該方法中判斷當(dāng)前與用戶交互的視圖是那種類型的視圖撒踪,并處理當(dāng)前UITableView是否能同時(shí)響應(yīng)該手勢(shì)。而在swift中我們不能重寫方法大渤,應(yīng)該遵守UIGestureRecognizerDelegate協(xié)議制妄,并實(shí)現(xiàn)該協(xié)議中的shouldRecognizeSimultaneouslyWith代理方法。
2.在最開(kāi)始的時(shí)候底部tableView能夠滑動(dòng)兼犯,scrollView上的tableView不能滑動(dòng)忍捡。
3.當(dāng)cellA所在的section的sectionHeader滑動(dòng)到頂部的時(shí)候集漾,scrollView上的幾個(gè)tableView可以滑動(dòng)切黔。
4.當(dāng)scrollView上的tableView在Y方向的偏移量為0的時(shí)候,scrollView上tableView不能滑動(dòng)具篇,底部的tableView能滑動(dòng)纬霞。
注意:tableView能滑動(dòng)或不能滑動(dòng)不是設(shè)置它們的滑動(dòng)屬性為YES或NO,而是設(shè)置偏移量為CGPointZero驱显。
核心代碼:
1.監(jiān)聽(tīng)底部tableView的偏移量诗芜,從而設(shè)置該tableView以及scrollView上幾個(gè)tableView是否能滑動(dòng)
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat statusH = [UIApplication sharedApplication].statusBarFrame.size.height;
CGFloat navigationBarH = self.navigationController.navigationBar.frame.size.height;
CGFloat bottomCellOffset = [self.tableView rectForSection:3].origin.y - statusH - navigationBarH;
if (scrollView.contentOffset.y >= bottomCellOffset) { // 第二個(gè)sectionHeaderView滑動(dòng)到頂部
scrollView.contentOffset = CGPointMake(0, bottomCellOffset);
self.canScroll = NO;
self.subCell.cellCanScroll = YES;
}else{
if (!self.canScroll) {
scrollView.contentOffset = CGPointMake(0, bottomCellOffset);
}
}
}
2.設(shè)置scrollView上幾個(gè)tableView是否能滑動(dòng)
- (void)setCellCanScroll:(BOOL)cellCanScroll{
_cellCanScroll = cellCanScroll;
for (SubTableView * tableView in self.subTableviews) {
tableView.canScroll = cellCanScroll;
if (cellCanScroll) {
NSLog(@"可以滑動(dòng)了...");
}else{
tableView.contentOffset = CGPointZero;
}
}
}
3.監(jiān)聽(tīng)scrollView上幾個(gè)tableView的偏移量,從而通知底部tableView是否可滑動(dòng)
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSInteger viewTag = scrollView.tag;
for (NSInteger i = 0; i < self.subTableviews.count; i ++) {
if (viewTag == i) {
SubTableView * tableview = self.subTableviews[i];
if (tableview.canScroll) {
NSLog(@"????????????????");
}else{
tableview.contentOffset = CGPointZero;
}
if (tableview.contentOffset.y <= 0) {
tableview.canScroll = NO;
tableview.contentOffset = CGPointZero;
[[NSNotificationCenter defaultCenter] postNotificationName:@"mainCanScroll" object:nil];//到頂通知父視圖改變狀態(tài)
}
}
}
}
4.接收通知埃疫,從而設(shè)置底部tableView以及scrollView上幾個(gè)tableView是否能滑動(dòng)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeScrollStatus) name:@"mainCanScroll" object:nil];
}
- (void)changeScrollStatus{
self.canScroll = YES;
self.subCell.cellCanScroll = NO;
}