更新
<p>谢谢各位朋友帮我想主意。此项目需求解决方案总结如下:</p>
tableview
或者collection view
通用办法,设置两个组。第一个组没有item
或者cell
,只有SectionHeader
。
(这里如果是collectionview
并且iOS9以下想要达到tableview
的SectionHeaderView
那样的悬停效果需要自定义布局。如果是iOS9以上可以通过一下两个属性设置
@property (nonatomic) BOOL sectionHeadersPinToVisibleBounds NS_AVAILABLE_IOS(9_0);
@property (nonatomic) BOOL sectionFootersPinToVisibleBounds NS_AVAILABLE_IOS(9_0);
)
2.如果是tableview,还可以同时设置headerView以及sectionHeaderView,因为sectionHeaderView在tableview是plain的方式下是悬停的,而headerView是不悬停的。
3.本文章所写的最土的方法
</br>
<p>最近在做一个项目,首页是这样设计的</p>
<p></p>
- 问题背景
<p>整体首页是一个scrollview。从上到下依次是banner,三个按钮,目录,collectionview</p>
<p>希望滚动时,目录滚动导航栏下方时可以悬停,只有collectionview继续滚动</p> - 思考方式
<p>创建collectionview
时设置scrollEnabled
为No,在- (void)scrollViewDidScroll:(UIScrollView *)scrollView
中根据contentOffset.y
判断开启或关闭首页整体scrollview
和collectionview
的scrollEnabled
属性。</p>
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (scrollView != _scrollview){//滚动的是 collectionview
if (scrollView.contentOffset.y <=0) {
_scrollView.scrollEnabled = NO;
}
}else{//滚动的主scrollview
CGFloat bottomOffset = _scrollview.contentSize.height - _scrollview.bounds.size.height ;
if ((int)scrollView.contentOffset.y > (int)(bottomOffset) + 45) {
[scrollView setContentOffset:CGPointMake(0, bottomOffset + 49) animated:NO];
_collectionview.scrollEnabled = YES;
}else {
[_collectionview setContentOffset:CGPointZero animated:NO];
_collectionview.scrollEnabled = NO;
}
}
}
- 问题
<p>很快就引出来问题,因为两个scrollview嵌套,同一个手势不会同时控制两个scrollview。最明显的表现就是,手势拖动目录
悬停在导航栏下面,但是collectionview
无法继续滚动,也就是继续向下滚动无效。并且,如果通过collectionview
向上滚动到顶部时scrollview
无法继续滚动。也就是继续向上滚动无效。</p>
<p>我思考着因为这是同一个拖拽手势,因此手势对象不变的话,或许应该改变手势所被添加的view
上面,这样就改变了手势所操作的view
。
因此,在- (void)scrollViewDidScroll:(UIScrollView *)scrollView
判断中,将scrollEnabled
的设置改成scrollview.panGestureRecognizer
这一对象所操作的view
的设置,于是尝试了以下代码</p>
[scrollView removeGestureRecognizer:scrollView.panGestureRecognizer];
[_collectionview addGestureRecognizer:scrollView.panGestureRecognizer];
<p>但是完全没有效果。之后也尝试了设置panGestureRecognizer.Enable
属性,效果与scrollEnabled
的设置是一样的,会出现卡顿。
google了一番,也没有找到合适的结局办法。只能动用一些土法子了。</p>
<p>因为赶项目并且能力有限,实在没办法深入研究。心里总想着更改panGestureRecognizer
某些设置可以达到效果。如果有哪位大神已经做到,还请告知,小弟感激不尽。</p>
- 解决方法
<p>直接设置collectionview
不可以滚动,根据请求到得数据动态设置collection view
的高度,以及scrollview
的contentSize
属性。
但需求要求目录悬停,因此创建了两个目录,一个添加在scrollview
的上面,一个添加在window
上面。在- (void)scrollViewDidScroll:(UIScrollView *)scrollView
判断,设置window
上面的显示或隐藏。
这样确实完美解决了同一个手势滑动两个scrollview卡顿的问题。
</p> - 引出问题
<p>
这个问题也是我不喜欢把东西加载window
上面的原因。因为上面的解决方式,多创建了一个目录在window
上。大家如果用UIAlertController
会有这种体验(UIAlertView
不会),AlertController
与我们自己加在window
上得view在同一个window
上面,并且系统默认的阴影效果盖不住我们创建的view
,这样也就不会影响view
在有弹框时的操作。
</p> - 解决方法
<p>幸好controller
的view是UIView
,在view
的基础上直接创建了一个目录添加view
上面,使其覆盖scrollview
。这样的思路,让我想起以前,在tableviewController
上需要添加悬浮view
也可以这样应用。
你若问为啥不用UIAlertView
就不存在这种问题了。臣妾做不到啊。</p>
<p>问题虽然也解决了,但方法还有待优化。还是那句话,如有大神已经找到更好的解决方法,还请告知,小弟感激不尽。</p>