(感觉https://www.jianshu.com/p/a540b7390c14这片文章的效果更好)
看效果图:
实现思路:
最底层使用一个UIScrollView,上方蓝色视图使用一个简单的UIView,下方使用一个UIScrollView,该ScrollView上方放两个UITableView和两个简单View(红色和黄色的视图)
核心思想:
在最开始滑动的时候底部的两个蓝色TableView不能进行滑动,当最底层的绿色ScrollView的偏移量达到一定偏移的时候(偏移量为上方蓝色视图的高度)不再发生偏移,此时底部的两个蓝色TableView可以进行滑动。而当两个蓝色TableView的偏移量变成0的时候不再发生偏移,而此时最底层的绿色ScrollView再度能发生偏移。
看代码:
最底层绿色ScrollView
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat contentOffsetY = scrollView.contentOffset.y;
CGFloat maxOffsetY = MAXOFFSETY;
if (contentOffsetY >= maxOffsetY) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"contentCanMove" object:nil]; // 告诉底部内容视图能进行滑动了
canMove = NO; // 自己不能滑动了
}
if (canMove == NO) {
[scrollView setContentOffset:CGPointMake(0, maxOffsetY)];
}
}
第二层的黄色ScrollView
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (canMove == YES) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"OtherCanNotMove" object:nil]; // 告诉其他滚动视图不能滚动了
}else{
[scrollView setContentOffset:CGPointMake(0, 0)];
}
CGFloat offsetY = scrollView.contentOffset.y;
if (offsetY <= 0) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"OtherCanMove" object:nil]; // 告诉其他滚动视图能滚动了
canMove = NO; // 自己不能滑动了
}
}
注意:为了让ScrollView上的多个手势能一起触发,我们要重写最底层绿色ScrollView的方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
//返回YES,则可以多个手势一起触发方法,返回NO则为互斥(比如外层UIScrollView名为mainScroll内嵌的UIScrollView名为subScroll,当我们拖动subScroll时,mainScroll是不会响应手势的(多个手势默认是互斥的),当下面这个代理返回YES时,subScroll和mainScroll就能同时响应手势,同时滚动,这符合我们这里的需求)
return YES;
}
demo地址:https://gitee.com/liangsenliangsen/uiscrollview_nesting.git
再看下别人写的效果更好的效果图和demo:
效果图:
demo地址:https://gitee.com/liangsenliangsen/uiscroll_hovering.git
本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊