标准的UICollectionView包含三个部分,它们都是UIView的子类: • Cells 用于展示内容的主体,对于不同的cell可以指定不同尺寸和不同的内容,这个稍后再说 • Supplementary...:@"MY_CELL_ID"]; //如果没有可重用的cell,那么生成一个 if (!...,用作cell平时的背景 • 再其上是selectedBackgroundView,是cell被选中时的背景 • 最后是一个contentView,自定义内容应被加在这个view上 ...需要注意根据滚动方向不同,header和footer的高和宽中只有一个会起作用。垂直滚动时section间宽度为该尺寸的高,而水平滚动时为宽度起作用,如图。 ...加载过程 总的加载过程是先加载UICollectionView的委托回调配置,再初始化UICollectionViewCell。
更加灵活的进行布局,但都限制在系统为我们准备好的布局框架中,还是有一些局限性,例如,如果我要进行瀑布流似的不定高布局,前面的方法就很难满足我们的需求了,如下: ?...]init]; [super prepareLayout]; //演示方便 我们设置为静态的2列 //计算每一个item的宽度 float WIDTH = ([UIScreen... //这个数组的主要作用是保存每一列的总高度,这样在布局时,我们可以始终将下一个Item放在最短的列下面 CGFloat colHight[2]={self.sectionInset.top...()%150+40; //哪一列高度小 则放到那一列下面 //标记最短的列 int width=0; if (colHight[0]<colHight...:(NSInteger)section{ return 100; } -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
iOS UICollectionView实现跑马灯和轮播效果.gif 功能描述:WSL_RollView 是基于UICollectionView实现的支持水平和垂直两个方向上的的分页和渐进循环轮播效果...一、实现方法 ①、 首先用UICollectionView和计时器实现一个基本的水平滚动效果,如下图,这个太简单就不在此详述。...iOS UICollectionView ②、对比上面的效果图,我们还需要解决分页的宽度和循环滚动的问题。...自定义分页宽度:默认的分页宽度是UICollectionView的宽度,所以当分页宽度的不等于UICollectionView的宽度或分页间隔不等于0时会出现错误,这时就需要我们通过自定义UICollectionViewFlowLayout...,示例代码请看这儿WSL_RollView;如果小伙伴们有其他的实现方法,欢迎再此留言交流?????
可能会在你的项目中用到这玩意,最近也是要用就简单的写了一个 Demo。...下面是简单的一个效果图,先给看看效果图!...*/ // typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型。...// typedef [super prepareLayout]; // 设计 item的宽度 设计3列或者2列 float WIDTH = ([UIScreen...//这个数组的主要作用是保存每一列的总高度,这样在布局时,我们可以始终将下一个Item放在最短的列下面,初始化值全都定义成零 CGFloat colHight[3]={0,0,0};
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(...(nonatomic,assign)NSInteger cellCount;//cell的总个数 @end 在属性变量中我们定义了一个 一个delegate,一个用于存放列高度的数组,一个存放cell...位置信息的字典,一个cell的总个数。...最后,我们按照每一个frame对应的indexPath方式将一个cell对应的位置,frame信息存入字典。以便于后面显示的时候直接从字典中取就可以了。...是否有交集,如果结果为true,则此cell应该显示,将布局字典中对应的indexPath加入数组 //NSLog(@"indexPathsOfItem"); NSMutableArray
我们知道在 UICollectionView 的属性中,有一个分页的属性:isPagingEnabled,当设置成 true 时,每次滚动的位移量等于它自身 frame 的宽度;当不设置这个分页属性,它的默认值是...记录了滚动的目标位移坐标,通过这个坐标和记录的上次滚动的坐标可以判断出是向左滚动还是向右滚动 如果俩坐标的水平方向相减的绝对值大于某个固定值(譬如说 item 宽度的 8 分之一),则可以判断发生了分页...,然后通过 proposedContentOffset 位移坐标和 item 的宽度大小来计算出当前滚动的页码;如果小于那个固定值,则不发生分页 最后记录最新的偏移坐标,然后返回 UICollectionView...播客 终于讲到最后一个 UI 了,先看下效果: image 经历过构建上面这么多 UI 后,想必看到这个效果,大家都心知肚明了,还有比用 UICollectionView 更简单的方式了吗?...搜索 关于如何构建不同的 Cell 到这里就讲完了,如果大家有疑问的话,欢迎在评论区或者我的公号中发信息给我。 接下来,我们开始讲首页的最后一部分---搜索框。
,就比如创建一个如下的circleLayout: ?...这种布局方式在apple的官方文档中也有介绍,是UICollectionView的一个应用示例。...类,系统为我们实现好的一个布局方案。...,来进行圆环布局的设置,首先是prepareLayout,为布局做一些准备工作,使用collectionViewContentSize来设置内容的区域大小,最后使用layoutAttributesForElementsInRect...,我们就实现哦圆环布局,随着item的多少,布局会自动调整,如果不是UICollectionView的功劳,实现这样的功能,我们可能要写上一阵子了^_^。
在上篇博客中,给大家演示了如何利用 UICollectionView 这个强大的控件去实现一个卡片轮播的效果,后来有网友联系我说:"他遇到一个问题,当他滚动的 item 宽度与屏幕宽度一致时,滚动效果是正常的...这个问题确实是存在的,因为在 UICollectionView 的属性中,有一个分页的属性:isPagingEnabled,当设置成 true 时,每次滚动的位移量等于屏幕的宽度;当不设置这个分页属性,...proposedContentOffset 记录了滚动的目标位移坐标,通过这个坐标和记录的上次滚动的坐标可以判断出是向左滚动还是向右滚动4.如果俩坐标的水平方向相减的绝对值大于某个固定值(譬如说 item...宽度的 8 分之一),则可以判断发生了分页,然后通过 proposedContentOffset 位移坐标和 item 的宽度大小来计算出当前滚动的页码;如果小于那个固定值,则不发生分页5.最后记录最新的偏移坐标...,如果小于最小的contentsize或者最大的contentsize则重置值 if lastOffset.x < offsetMin { lastOffset.x
前言 最近公司一个电商应用要实现一个类似淘宝淘抢购页面逻辑的功能,起初本来想找个第三方的组件,后面发现网上并没有类似的实现。所以后面决定自己封装一个,效果如下所示: ? 2....: /** MenuItem 的宽度 */ @property (nonatomic, assign) CGFloat itemWidth; /** Menu 的高度 */ @property (nonatomic...*/ @property (nonatomic, strong) UIColor *maskFillColor; /** Menu mask三角形的宽度 */ @property (nonatomic...实现: 知道了原理,那就开始构思: 1、我的实现思路是用UICollectionView来实现滚动菜单; 2、需要两个UICollectionView,UICollectionViewCell的文字内容一样...,一个UICollectionView在遮罩下面,一个在遮罩上面; [self addSubview:self.collectionViewBottom]; [self addSubview:self.maskView
这就要谈到新的cell的生命周期了。 先来看看老的 UICollectionViewCell的声明周期。当用户滑动屏幕,屏幕外有一个cell准备加载显示进来。...当cell马上要进入屏幕的时候,就会调用willDisplayCell的方法。这个方法给了我们app最后一次机会,为cell进入屏幕做最后的准备工作。...UICollectionView的流畅的滑动解决了,那么在UICollectionViewCell在加载的时候所花费的时间,怎么解决呢??...,然后给estimatedItemSize设定一个新的常数, 最后UICollectionViewFlowLayout 就会自动计算高度了。...refreshControl,再关联一个action事件,最后把这个新的refreshControl赋给想要的控件的对应的属性即可。
(之前开发遇过这个问题,但是被自己用"画线填充"的方式取巧搞定了,没想到这次有同事问我这个问题,为了能有一个通用的方法,还是要去找出原因)。...它们有什么联系?...造成缝隙的原因 iPhone6的屏幕像素(point,也叫逻辑像素)是375*667,物理像素为750*1334,等分4份的话每一个item的宽度是375/4=93.75,这里是没有问题的,问题是屏幕能分的最小物理像素是...,则求最大的整数但不大于本身....if (realItemWidth < itemWidth) {// 有可能原cell宽度小数点后一位大于0.5 realItemWidth += fixValue; }
如果我们将系统的pickerView沿着y轴旋转90°,你会发现侧面的它是一个规则的正多边形,这里的radius就是这个多边形中心到其边的垂直距离,也是内切圆的半径,所有的item拼成了一个正多边形,示例如下...对于angle属性,它是每一个item的x轴旋转度数,如果我们将所有item的中心都放在一点,通过旋转让它们散开如下图所示: ? 每个item旋转的弧度就是其索引/(2*pi)。...我们可以直接在ViewController中实现其代理方法,如下: -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ //小于半屏 则放到最后一屏多半屏...<200) { scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y+10*400); //大于最后一屏多一屏...,上面的逻辑刚好可以无缝对接,但是会有新的问题,一开始运行,滚轮就是出现在最后一个item的位置,而不是第一个,并且有些相关的地方,我们也需要一些适配: 在viewController中: //一开始将
,如果我们要实现要求高一点的定制化布局,它就没法满足实际的要求了,那我们能否实现自定义的布局方案呢!...自定义布局 日常开发中,我们使用 UICollectionView 控件都会搭配一个默认的,提供一些基础的布局 UICollectionViewFlowLayout 来使用,但是当我们需要实现定制化程度比较高的界面时....声明一个变量表示布局中列的数量:cols3.声明一个数组变量用于缓存计算好的布局属性:[UICollectionViewLayoutAttributes]4.声明一个数组变量用于存放每列的高度:[CGFloat...的位置信息赋值,最后再更新一下每列的高度,直到为每一个 Cell 都重新计算了一遍它的位置。...: 好了, 利用 UICollectionView 控件与自定义布局实现瀑布流的内容到此就结束了,最后附上项目的源码地址: https://github.com/ShenJieSuzhou/SwiftScrollBanner
本文就介绍纯用代码创建UICollectionView的简单示例,效果如下图: 实现 如图所示,视图由一个个方块组成,每个方块中有一张图片以及一个标题文字。...如果熟悉UITableView的话,其实很多地方都是类似的,甚至可以说UITableView是一种特殊的UICollectionView,正如正方形是一种特殊的矩形一样,UITableView就是一种每行只放一个方块的...所以我们创建一个继承自UICollectionViewCell的类用来自定义我们的cell,代码如下: // CollectionViewCell.h @interface CollectionViewCell...控制器 接着我们来创建UICollectionView,UICollectionView和UITableView的相同之处在于它们都是由DataSource填充内容并有Delegate来管理响应的,并且都实现了循环利用的优化...不同之处在于UICollectionView需要一个布局参数来决定cell是如何布局的,默认是流水布局,也就是我们最常见的形式,也就是上面图里的形式;此外,UICollectionView除了垂直滚动,
UICollectionView 开发系列的第五篇,这也是该系列计划写的最后一篇啦!...当然,如果苹果开发者团队推出了关于 UICollectionView 的新的技术或者是我在开发中发现了新的技术点,我还是会持续更新这个系列,最终的目的是我希望通过这个系列的文章能把 UICollectionView...如果你的产品经理给你提了一个需求,要求你要为 UICollectionView 的 section 设置背景, 但当你查阅文档的时候,你就会发现 UICollectionView 是无法通过属性设置来为...<numberOfSections { // 2.1 获取这个 section 第一个以及最后一个 item 的布局属性 guard let numberOfItems...最后,我们来看下最终效果: 最后 关于 UICollectionView 系列的整理,到今天就要短暂的划上一个句号了,在写这个系列之前,我对 UICollectionView 的想法就是:无非就是比
IGListKit IGListKit是Instagram出的一个基于UICollectionView的数据驱动UI框架,目前在github上有9k+ star,被充分利用在Instagram App...上,可以访问外国网站的同学可以去体验一下,看看Instagram的体验,想想如果那些页面让小明用传统方式实现,那将是什么样的情况。...ListSectionController 一个 section controller是一个抽象UICollectionView的section的controller对象,指定一个数据对象,它负责配置和管理...第三个:图片展示 九宫格的图片展示,用UICollectionView是最简单的实现方式。...最后同样的操作,在ListStackedSectionController里面再加一个就又ok了。 小明花了一天就重构完了这个页面,并且再也不怕后面产品经理提出的奇葩需求了。
fitEnd:将原图按比例缩放到ImageView的高度或者宽度,在ImageView的底部显示 fitStart:将原图按比例缩放到ImageView的高度或者宽度,在ImageView的上部显示...center:不改变原图的大小,在原图的中心部分显示在ImageView的中心,当原图超过ImageView不做显示,裁剪掉。...centerCrop:以原图填满ImageView为目的,如果原图size大于ImageView的size,则与center_inside一样,按比例缩小,居中显示在ImageView上。...centerInside:以原图正常显示为目的,如果原图大小大于ImageView的size,就按照比例缩小原图的宽高,居中显示在ImageView中。...从上面的解析中,我们可以看出: 以FIT_开头的4种,它们的共同点是都会对图片进行缩放; 以CENTER_开头的3种,它们的共同点是居中显示,图片的中心点会与ImageView的中心点重叠; ScaleType.MATRIX
,结果只会正好合适或超过裁剪,这里就不细说,最后的结论就是使用cover。...9:16,当然可能还是有些瑕疵,因为可能会有地址栏或工具栏,所以如果使用top定位,则底部不要放一些重要的视觉,因为可能会被裁剪掉,而如果是center定位,则顶部和底部都不要放重要的视觉,还是因为可能会被裁剪掉...这里先根据实际内容分两种情况,第一种是固定宽度的内容,内容宽度小于320px的;还有一种是内容大于320px甚至是大于360px的,所以就需要考虑窄屏时候的缩放。...固定宽度的内容 先把所有元素放在一个容器中,对这个容器进行垂直居中定位,水平全屏。里面实际元素的定位,则根据这个容器进行。...,于是又回到了上面的固定宽度 通过计算得到其宽度与视窗宽度的百分比,设置该元素的宽度为百分比单位,如果内容是img引入的图片,则高度自动变化,如果是bg图片,则高度则采用上面的容器宽高比的方式来设置,且设置
领取专属 10元无门槛券
手把手带您无忧上云