`

使用CSStickyHeaderFlowLayout实现头部固定的CollectionView

 
阅读更多

最近流行的一种界面效果,是瀑布流的header固定,也叫sticky header或者parallax。对于UITableView,可以比较方便地让table header固定,但是对于UICollectionView,原生的iOS API比较难以实现。本文推荐一个开源组件,专门用于实现这种效果:CSStickyHeaderFlowLayout

整体效果

贴个整体示意图

sticky header

配合autolayout使用

首先需要注意的是,这个组件必须配合autolayout来使用。比如整个header分为4个部分,我想固定的是其中下面的2个subview,一开始我的代码是写死这2个subview的坐标

UILabel *header1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 375, 50)];
header1.backgroundColor = [UIColor yellowColor];
header1.text = @"1111";

UILabel *header2 = [[UILabel alloc] initWithFrame:CGRectMake(0, 50, 375, 50)];
header2.backgroundColor = [UIColor blueColor];
header2.text = @"2222";

这样的话就无法获得预期的效果,因为虽然整个Supplementary的height缩小了,但是subview的坐标却是固定的,所以不会随着header被推到顶部。正确的做法是使用autolayout,我这里用的是masonry

UILabel *header1 = [UILabel new];
header1.backgroundColor = [UIColor yellowColor];
header1.text = @"1111";

UILabel *header2 = [UILabel new];
header2.backgroundColor = [UIColor blueColor];
header2.text = @"2222";

[self addSubview:header1];
[self addSubview:header2];

[header1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.bottom.equalTo(header2.mas_top);
    make.left.equalTo(@0);
    make.height.equalTo(@50);
    make.width.equalTo(@375);
}];

[header2 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.bottom.equalTo(@0);
    make.left.equalTo(@0);
    make.height.equalTo(@50);
    make.width.equalTo(@375);
}];

切换cell类型时,注意处理offset

当切换“投票”和“排行榜”的时候,并没有替换Layout,但是切换了不同的cell实现,所以2边的contentOffset是不同的,有可能出现某一组cell已经向下滚动了很多,而另外一组cell在这个位置上无法正确的显示。处理的办法是,如果offset已经超过某个值,则滚动到顶部

// 如果已经超过顶部,则滚动到顶部
if(myView.contentOffset.y >= 70){
    [myView setContentOffset:CGPointMake(0, 70)];
}

与MJRefresh的冲突解决

MJRefresh是另一个流行的下拉刷新组件,当CSStickyHeaderFlowLayout和它一起使用的时候,在下拉刷新时会出现2次奇怪的动画效果。原因是MJRefresh的实现是修改了UICollectionView的contentInset,而CSStickyHeaderFlowLayout在0.2.7版本没有正确处理这种情况。作者已经在0.2.8修复了此问题。issue的具体现象和处理过程在ghost image issue#85

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    iOS开发技巧

    为了在CollectionView中实现类似TableView的悬浮头部效果,可以使用`CSStickyHeaderFlowLayout`布局。这种布局允许头部随着列表滚动而保持在屏幕上,提高了用户的阅读体验。 #### 14. 使用一个pan手势代替多个方向...

    ios-StickyHeaderFlowLayout.zip

    在iOS开发中,UICollectionView...在实现以上逻辑后,我们需要在UICollectionView初始化时设置这个自定义布局,并确保在数据源方法`- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView ...

    CSStickyHeaderFlowLayout:将UICollectionView替换为UITableView。 像Parallax Header,Sticky Section Header一样做更多的事情。 专为iOS 7设计

    CSStickyHeaderFlowLayout贡献者对于任何想成为存储库贡献者的人,请阅读 在一个UICollectionViewLayout中就完成了视差,粘页眉,图像标题的增长。安装椰子足CSStickyHeaderFlowLayout可通过,要安装它,只需添加到...

    可伸缩设计的布局效果

    该源码实现了可伸缩设计的布局效果,源码CSStickyHeaderFlowLayout,CSStickyHeaderFlowLayout是UITableView的替代选择,可实现图片的滚动视差和可伸缩设计。 测试环境:Xcode 5.0,iOS 6.0以上

    leetcode下载-iOS-small-function:iOS-Demo小功能

    8.CSStickyHeaderFlowLayout-master 9.DatePickerAlertView-时间选择器 10.Demo_AttributedLable-master 11.DLRadioButton-master 12.HWPopController 13.KVCDemo 14.NSDate-Extensions-master 15.ScrollViewDemo 16...

Global site tag (gtag.js) - Google Analytics