2015-03-03 4 views
0

я хочу сделать, как показано ниже: 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

вы можете сказать мне, что я отсутствует? Я новичок в быстром, а также в коллекции. И я получаю ссылку от https://github.com/bryceredd/RFQuiltLayout, но не получаю ее код. помогите решить мой вопрос

+0

Вы проверили HTTPS: //github.com/chiahsien/CHTCollectionViewWaterfallLayout –

+0

@ZaidPathan можете ли вы объяснить свой подход к выполнению пользовательских макетов? –

+0

Это можно сделать более корректно с помощью UIScrollView. Попробуйте создать UIImageView с различными кадрами и добавить их в scrollview. –

ответ

0

Установить ограничение высоты коллекции и установить значение по умолчанию в раскадровке и создать объект для этого ограничения в вашем классе.

@IBOutlet weak var collectionViewHeight: NSLayoutConstraint! 

Получить высоту содержимого представления коллекции после перезагрузки() метод и установить постоянное значение высоты ограничения

collection_view.reloadData() 

let height = collection_view.collectionViewLayout.collectionViewContentSize().height 
       collectionViewHeight.constant = height 
collectionViewHeight.constant = height 
Смежные вопросы