1、為了展示嵌套效果冰蘑,適配復(fù)雜布局內(nèi)部采用了三個(gè)子ViewController:
FirstViewController 內(nèi)部為TableView布局
SecondScrollViewController 內(nèi)部為ScrollView布局
ThirdViewController 為CollectionView 布局
2和泌、FirstViewController、SecondScrollViewController祠肥、ThirdViewController分別實(shí)現(xiàn)了NestedDelegate接口:
@protocol NestedDelegate <NSObject>
-(UIScrollView *)getNestedScrollView;
@end
3武氓、ViewController中通過NestedDelegate
獲取到子類的UIScrollView
,通過KVO監(jiān)聽UIScrollView->contentOffset
的變化:
[_currentNestedDelegate.getNestedScrollView addObserver:self forKeyPath:kObseverKeyContentOffset options:NSKeyValueObservingOptionNew context:nil];
(這里需要注意,切不可在ViewController中給_currentNestedDelegate.getNestedScrollView
設(shè)置滾動(dòng)的代理仇箱,設(shè)置了會(huì)形成循環(huán)引用導(dǎo)致crash)
4聋丝、滾動(dòng)處理的核心代碼:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
//最大上滑距離
CGFloat maxOffset = _layoutHeaderViewHeight.constant;
CGFloat mainContentOffsetY = _mainScrollView.contentOffset.y;
if (scrollView == _mainScrollView) {
if (mainContentOffsetY > maxOffset) {
[_mainScrollView setContentOffset:CGPointMake(0, maxOffset)];
}else if(mainContentOffsetY < 0){
[_mainScrollView setContentOffset:CGPointMake(0, 0)];
}
}else if (scrollView == _currentNestedDelegate.getNestedScrollView){
UIScrollView *currentScrollView = _currentNestedDelegate.getNestedScrollView;
CGFloat currentOffsetY = currentScrollView.contentOffset.y;
//避免死循環(huán)
if (currentOffsetY == 0) {
return;
}
if(currentOffsetY < 0){
//下滑
if(mainContentOffsetY > 0){
//將子scrollview的滑動(dòng)距離賦值給mainScrollView
[_mainScrollView setContentOffset:CGPointMake(0, mainContentOffsetY+currentOffsetY)];
//重置子scrollview的offset
[currentScrollView setContentOffset:CGPointMake(0, 0)];
}
}else if(currentOffsetY >0){
//上拉
if(mainContentOffsetY < maxOffset){
//將子scrollview的滑動(dòng)距離賦值給mainScrollView
[_mainScrollView setContentOffset:CGPointMake(0, mainContentOffsetY+currentOffsetY)];
//重置子scrollview的offset
[currentScrollView setContentOffset:CGPointMake(0, 0)];
}
}
}
}
1、嵌套UITableView效果
嵌套UITableView效果.gif
2工碾、嵌套UIScrollView效果
嵌套UIScrollView效果.gif
3弱睦、嵌套UICollectionView效果
“嵌套UICollectionView效果.gif
1、源碼地址