使用CSStickyHeaderFlowLayout实现头部固定的CollectionView

近期流行的一种界面效果,是瀑布流的header固定,也叫sticky header或者parallax。对于UITableView,能够比較方便地让table header固定,可是对于UICollectionView,原生的iOS API比較难以实现。

本文推荐一个开源组件。专门用于实现这样的效果:CSStickyHeaderFlowLayout

总体效果

贴个总体示意图

配合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

时间: 2024-08-01 22:47:44

使用CSStickyHeaderFlowLayout实现头部固定的CollectionView的相关文章

头部固定的table

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>头部固定table</title> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <meta name="viewport

Tab表格thead头部固定(demo)

注:引入 bootstrap.css  和jq <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Tab表格thead头部固定</title> <link rel="stylesheet" href="style/bootstrap.css" /> </head> <body&

导航头部固定jQuery代码

鼠标滑动,nav固定效果~代码如下: JQ: <script type="text/javascript" src="jquery-1.7.2.js" ></script> <script type="text/javascript">    $(function(){        var headerHeight=$(".header").height()+10;  //获取头部高度  

导航页面头部固定

//绑定需要浮动的表头 $(function () { $("#floatHead").smartFloat(); }); //智能浮动层函数 $.fn.smartFloat = function () { var position = function (element) { var top = element.position().top; var pos = element.css("position"); $(window).scroll(function

网页制作中在头部固定悬浮table表头(thead)的方法

这两天接了一个需求,页面是这样的 然后需求是页面中的这个表格当页面向上滚动,且表格的表头到达窗口上方时,表头悬浮在页面的上方,表格正常滚动,这样表格内的数据可以随时看到表头内容. 一开始我认为这是极简单的,就当页面滚动,判断表头到窗口的距离,当=0的时候触发事件然后让表头position:fixed不就万事大吉了吗?于是我对漂亮又萌萌哒的产品妹子说,放心吧,这个简单的很一会就能完事,当时我的表情是这样的 但是当我开始写(首先你要知道,我是个js小白,表问我为什么...),问题就来了.首先,这个页

ionic 最简单的路由形式,头部固定,下面tab切换-------一个简单的单页切换起飞了

<ion-header-bar class="bar-dark" align-title="left"> <h1 class="title" >微信 </h1> <span class="button button-clear"> <i class="icon ion-plus padding-right"></i> <i cla

Html5添加实用的仿Instagram头部固定跟随滚动特效插件教程

一.使用方法 <script src="js/jquery.min.js"></script> <script src="js/feedify.min.js"></script> 二.Html结构 <div class="feedify"> <div class="feedify-item"> <div class="feedify-ite

常见页面布局-头部固定+自定义滚动条

做了一个小demo,属于常见的页面布局应用,适用于IE7+,Chrome,safari,Firefox,Opera,其他浏览器没有测试.应该还有很多小问题,不过这里仅仅是一个小demo,如果有发现一些小问题,可以和我交流,互相学习学习.以下是所有代码: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title&g

表格头部header固定

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus?"> <meta name="Author" content=""> <meta name="