股票场内基金交易,没时间盯盘?

   
使用优财助手电脑客户端记录下您的股票买入卖出数据,能帮您时刻盯盘,会根据您记录的未售出买入价计算上涨或下跌幅度,及时弹框通知您。想知道如何使用?快点击左方视频观看了解吧~~下载地址:http://youcaizhushou.com

相比于 UITableView 单纯的对表格进行上下拖动,UICollectionView 的特色之一便是它的布局——UICollectionViewLayout。通过它,只要拥有丰富的想象力和简单的数学基础,我们不仅可以做出最简单的网格排列,还能搭建出各种天马行空的创意布局。

UICollectionViewLayout 只是一个基类,无法直接使用。我们只能通过 UICollectionViewFlowLayout 或自定义 UICollectionViewLayout 子类来实现布局。

UICollectionViewFlowLayout

UICollectionViewFlowLayout (流水布局)是苹果为我们封装好了的一套布局方案,我们最常用的网格和线式布局都是由它来实现。

查看 UICollectionViewFlowLayout 头文件,可以看到主要分为两类:各类属性和代理方法。

如果对单一的 UICollectionView 内容视图没有特殊要求,可以通过调节属性进行统一的设置:

如果需要进行一些针对性设置,可以遵守 UICollectionViewDelegateFlowLayout 协议使用代理方法:

比如通过如下设置,可以得到一个类似相册模式单行水平滚动的布局(此处省略了数据源方法的实现):

布局效果:

UICollectionView中的布局1

自定义布局

显然 UICollectionViewFlowLayout 是无法实现我们许多要求的,这时只好自己动手丰衣足食了。

UICollectionViewLayoutAttributes

UICollectionViewLayout 实际上是通过 UICollectionViewLayoutAttributes 类来实现布局的,每一个 UICollectionView 内容视图都对应一个 UICollectionViewLayoutAttributes 对象。可以说自定义布局的绝大部分精力都用在设置 UICollectionViewLayoutAttributes 上。

它提供了三个类方法创建相应的 UICollectionViewLayoutAttributes 对象:

属性列表:

实现方法

  1. 调用 prepareLayout 方法;

    prepareLayout 方法是专门用来准备布局的,在布局之前,它会调用一次,之后只有在调用 shouldInvalidateLayoutForBoundsChange: 方法并返回YES、调用 invalidateLayout 方法和 UICollectionView 刷新的时候才会重新调用。因此,我们通常在这个方法中进行一些一次性的设置和计算,如 cell 中固定的布局属性等,以提高性能。

  2. 分别通过以下三个方法获得并设置不同 UICollectionView 内容视图的 UICollectionViewLayoutAttributes;

  3. 调用 layoutAttributesForElementsInRect: 方法;

    一般在这个方法中返回上一步中所有设置好的 UICollectionViewLayoutAttributes 组成的数组。注意此方法会多次调用,除非需要动态改变布局属性,否则最好将添加数组的代码放到 prepareLayout 方法中,以免重复执行消耗性能。

  4. 调用 collectionViewContentSize 方法设置 contentView 尺寸;

    如果不设置,则默认为 collectionView 的视图尺寸。同样的,由于此方法会多次调用,最好在 prepareLayout 方法中进行尺寸计算。

  5. 如果需要动态控制 UICollectionViewLayoutAttributes,调用 shouldInvalidateLayoutForBoundsChange: 方法并返回YES。

综合实例

自定义 UICollectionViewFlowLayout

流水布局的核心概念在于 cell 依据布局顺序排列,也就是说,如果我们需要的布局模式是顺序排列的,那么就可以通过自定义 UICollectionViewFlowLayout 子类的方式忽略一些繁琐的设置,达到省时省力的效果。

比如说上面的例子,想要更进一步达到如下滚动放大的相册布局:

UICollectionView中的布局2

我们要做的其实就是实时监控并设置进入屏幕区域 cell 的缩放比例。新建一个继承 UICollectionViewFlowLayout 的类后,只需要进行两部设置:

  1. 调用 shouldInvalidateLayoutForBoundsChange: 方法并返回YES以动态设置布局属性;

  2. 在 layoutAttributesForElementsInRect: 方法中设置实时缩放比例;

将这个自定义类替换上面例子代码中的 UICollectionViewFlowLayout 类,就能实现期望效果。

瀑布流布局

瀑布流布局显然不是顺序排列,因此只能完全自定义。

先看外部接口,除开基本的各类间距外,瀑布流的基本形式要求提供列数和每个 cell 的宽高比,这里可以用设置数据源代理的方式进行设置:

布局实现思路:由于是静态布局,无需调用 shouldInvalidateLayoutForBoundsChange: 方法,只用考虑每个 cell 的摆放位置(itemSize 属性和 center 属性)及布局完成后的 contentViewSize。

鉴于瀑布流的原则是讲新添加的 cell 放到底部 Y 值最小的列下面,我们可以用一个数组或字典实时记录每一列的底部 Y 值,辅助 cell 属性及 contentViewSize 的计算:

声明数组:

初始化:

接下来我们按照自定义布局步骤的思路一步步实现(这里不对代码按步骤进行割裂呈现,我认为完整版的可读性应该更流畅):

  1. 调用 prepareLayout 方法;

    思考一下有哪些无需多次设置的固定属性:

    • 每个 cell 的宽度;

    • layoutAttributesForElementsInRect: 方法所需的数组;

    • contentViewSize。

  2. 在 layoutAttributesForItemAtIndexPath: 方法中完成对 cell 的属性设置;

    • 通过数据源方法获得的宽高比计算出 cell 高度;
    • 通过 columnBottomYArray 计算出 cell 应该添加到的位置(中心点);
    • 更新 columnBottomYArray。
  3. 分别调用 layoutAttributesForElementsInRect: 方法和 collectionViewContentSize 方法返回已在 prepareLayout 方法中计算好的属性。

下面是完整代码:

   

想获得去掉 5 元限制的证券账户吗?

证券交易股票基金的佣金,不足 5 元会按照 5 元收取。比如交易 1000 元的股票,按照普遍的证券佣金手续费率万 2.5,其交易佣金为 0.25 元,小于 5 元,实际会收取佣金 5 元,买卖两次需要支付 10 元佣金成本,1% 的利润就这样没了。

如果您想去掉最低交易佣金 5 元限制,使用微信扫描左边小程序二维码,访问微信小程序「优财助手」,点击底部菜单「福利」,阅读文章「通过优财开证券账户无最低交易佣金 5 元限制」,按照文章步骤操作即可获得免 5 元证券账户,股票基金交易手续费率万 2.5。

请注意,一定要按照文章描述严格操作,如错误开户是无法获得免 5 元证券账户的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注