需求:
最近公司項(xiàng)目中要開發(fā)一個(gè)Scrollview嵌套多個(gè)TableView的頁面厦幅。類似下圖微博的這種頁面谱俭。
布局結(jié)構(gòu)如下圖:
遇到的問題:
開發(fā)這樣的結(jié)構(gòu)會(huì)有一個(gè)問題就是滑動(dòng)TableView到邊界的時(shí)候冰单,由于響應(yīng)鏈問題航闺,不會(huì)帶動(dòng)Scroll1繼續(xù)滑動(dòng)脆粥。最開始打算的是通過兩個(gè)滑動(dòng)視圖的偏移量來設(shè)置他們的scrollEnabled
软棺,切換響應(yīng)者红竭,以達(dá)到兩個(gè)視圖只有一個(gè)在滑動(dòng)的目的。但是這樣的話如果滑到頂部邊界時(shí)喘落,需要抬手再次進(jìn)行滑動(dòng)的才可以切換scrollEnabled
的狀態(tài)茵宪,這種滑動(dòng)不流暢的效果顯然不是我需要的。
解決思路:
后來發(fā)現(xiàn)蘋果有提供實(shí)現(xiàn)多個(gè)嵌套的 UIScrollView 同時(shí)響應(yīng)滑動(dòng)事件的方法瘦棋。在父視圖的ScrollView實(shí)現(xiàn)這個(gè)方法然后return YES
即可稀火。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
這樣上滑時(shí)就可以首先固定TableVIew的偏移量,TableVIew滑動(dòng)到頂部時(shí)再允許其滑動(dòng)赌朋,然后固定ScrollVIew的偏移量凰狞,下滑同理篇裁。
主要實(shí)現(xiàn)代碼:
在滑動(dòng)到邊界時(shí),通過通知赡若,也可以根據(jù)具體需求調(diào)整為通過代理來改變兩個(gè)視圖的CanScroll
狀態(tài)达布,來實(shí)現(xiàn)兩個(gè)視圖由誰來滑動(dòng)的目的。
父視圖ScrollVIew的滑動(dòng)代理方法:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat backScrollTopOffset = self.headerHeight;
if (scrollView == self.scrollView) {
if (!_canScroll) {
//固定contentOffset逾冬,使其不滾動(dòng)
self.scrollView.contentOffset = CGPointMake(0, backScrollTopOffset);
} else if (scrollView.contentOffset.y >= backScrollTopOffset) {
scrollView.contentOffset = CGPointMake(0, backScrollTopOffset);
self.canScroll = NO;
// 滑動(dòng)到頂部 通知tableView改變TableView的CanScroll狀態(tài)
[[NSNotificationCenter defaultCenter] postNotificationName:@"TableCanScroll" object:nil];
}
}
}
子視圖TableVIew的滑動(dòng)代理方法:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (!self.tableCanScroll) {
scrollView.contentOffset = CGPointZero;
} else if (scrollView.contentOffset.y <= 0) {
self.tableCanScroll= NO;
//通知ScrollView改變ScrollView的CanScroll狀態(tài)
[[NSNotificationCenter defaultCenter] postNotificationName:@"ScrollCanScroll" object:nil];
}
}