这才是瀑布流的效果?

dolacmeng iOS实战项目开发:瀑布流 最后由 qq_1ujz9vnl 于2017年11月11日回复

  • 2 回答
  • 2.7k 浏览

我修改老师的源代码,实现了下图的效果,感觉这才是真正的瀑布流效果?demo的ViewController.m中使用

 WaterFallFlowLayout *flowLayout = [[WaterFallFlowLayout alloc] init];

与使用

 UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];

的效果一样,说明WaterFallFlowLayout没有起到应有的效果。

我在WaterFallFlowLayout.m中添加以下代码

-(UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{

    UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];

     for (NSString *rectStr in _attributeDict) {

         if (_attributeDict[rectStr]==indexPath) {

             attributes.frame = CGRectFromString(rectStr);

         }

     }

     return attributes;

}

即可得到下面的效果。

CF69A353-31B0-451C-A98A-0BDF37C08C58.png

  • qq_1ujz9vnl 2017年11月11日 回答 #2楼
  • 你说的太对了!! 

    我写了修改后的demo,有Objective-C和Swift版本,运行良好,有截图,链接地址:

    http://www.googleplus.party/2017/11/11/iOS%E7%80%91%E5%B8%83%E6%B5%81/

        //这段代码很重要,
        //1.layoutItemAtIndexPath方法,来重新计算frame,并且存储上;
        //2.该函数目的是把重新计算的frame赋值给cell
        public override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
            let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
            for (keyRect, _) in attributesInDict! {
                if attributesInDict![keyRect] == indexPath {
                    attributes.frame = CGRectFromString(keyRect)
                }
            }
            return attributes
        }
  • 0 评论