如何在swift中动态更改集合视图的大小?

问题描述:

我想要做的象下面这样: enter image description here如何在swift中动态更改集合视图的大小?

我已经子类UICollectionViewLayout和我的代码是

var horizontalInset = 0.0 as CGFloat 
var verticalInset = 0.0 as CGFloat 
var itemHeight = 0.0 as CGFloat 
var _layoutAttributes = Dictionary<String, UICollectionViewLayoutAttributes>() 
var _contentSize = CGSizeZero 
var arrSize:[Int] = [0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0] 
var random:Int? 
var increaseRow = false 

// MARK: - 
// MARK: Layout 

override func prepareLayout() { 
    super.prepareLayout() 

    _layoutAttributes = Dictionary<String, UICollectionViewLayoutAttributes>() // 1 

    let path = NSIndexPath(forItem: 0, inSection: 0) 
    let attributes = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withIndexPath: path) 

    let headerHeight = CGFloat(self.itemHeight/4) 
    attributes.frame = CGRectMake(0, 0, self.collectionView!.frame.size.width, headerHeight) 

    let headerKey = layoutKeyForHeaderAtIndexPath(path) 
    _layoutAttributes[headerKey] = attributes // 2 

    let numberOfSections = self.collectionView!.numberOfSections() // 3 

    var yOffset:CGFloat = 0.0 

    for var section = 0; section < numberOfSections; section++ { 

     let numberOfItems = self.collectionView!.numberOfItemsInSection(section) // 3 

     var xOffset:CGFloat? 

     for var item = 0; item < numberOfItems; item++ { 
      let range = UInt32(19) 
      random = Int(arc4random_uniform(range)) 
      let indexPath = NSIndexPath(forItem: item, inSection: section) 
      let attributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath) // 4 

      var itemSize = CGSizeZero 
      var increaseRow = false 
       itemSize = randomItemSize() // 5 

      if item == 0 
      { 
       xOffset = self.horizontalInset 
       attributes.frame = CGRectIntegral(CGRectMake(xOffset!, yOffset, itemSize.width, itemSize.height)) 
       let key = layoutKeyForIndexPath(indexPath) 
       _layoutAttributes[key] = attributes // 7 
      }else 

      { 

       let previousIndexPath = NSIndexPath(forItem:indexPath.item-1, inSection:indexPath.section) 
       let key = layoutKeyForIndexPath(previousIndexPath) 
       let previousFrame:UICollectionViewLayoutAttributes = _layoutAttributes[key]! 

       if xOffset! + previousFrame.size.width + itemSize.width > self.collectionView!.frame.size.width 
       { 

        yOffset += self.horizontalInset+previousFrame.size.height 

        xOffset = horizontalInset 
        attributes.frame = CGRectIntegral(CGRectMake(xOffset!, yOffset, itemSize.width, itemSize.height)) 
        print("In if") 
        print("\n\(item):\(NSStringFromCGRect(attributes.frame))") 

        let key = layoutKeyForIndexPath(indexPath) 
        _layoutAttributes[key] = attributes // 7 

       }else 
       { 
        xOffset = xOffset! + horizontalInset + previousFrame.size.width 
        attributes.frame = CGRectIntegral(CGRectMake(xOffset!, yOffset, itemSize.width, itemSize.height)) 
        print("In else") 
        print("\n\(item):\(NSStringFromCGRect(attributes.frame))") 
        let key = layoutKeyForIndexPath(indexPath) 
        _layoutAttributes[key] = attributes // 7 
       } 

      } 

     } 
    } 

    yOffset += self.itemHeight // 10 

    _contentSize = CGSizeMake(self.collectionView!.frame.size.width, yOffset + self.verticalInset) // 11 

} 

,但得到的输出象下面这样: enter image description here

你能告诉我我是什么失踪?我对swift和收集视图都很陌生。我从https://github.com/bryceredd/RFQuiltLayout得到参考,但没有得到它的代码。请帮助解决我的问题

+0

你检查的https://github.com/chiahsien/CHTCollectionViewWaterfallLayout – 2015-03-04 05:29:38

+0

@ZaidPathan你能解释一下自己做定制布局的方法吗? – 2015-03-05 05:30:35

+0

这可以通过UIScrollView更加准确地实现。尝试使用不同的帧创建UIImageView并将其添加到滚动视图。 – 2016-03-17 11:54:57

设置集合视图的高度约束,并在故事板中设置一些默认值,并在您的类中为该约束创建一个对象。

@IBOutlet weak var collectionViewHeight: NSLayoutConstraint! 

获取后重装()方法集合视图的内容高度并设置高度约束的恒定值

collection_view.reloadData() 

let height = collection_view.collectionViewLayout.collectionViewContentSize().height 
       collectionViewHeight.constant = height 
collectionViewHeight.constant = height