2017-11-29 3 views
0

チャットビューに似たビューを作成します。最新のメッセージが画面の下部に表示されます。私はUICollectionViewCellsを画面の下部に「固定」したいと思います。デフォルトのフローレイアウトとは逆です。これどうやってするの?私は別のstackoverflowの答えから、このコードを持っているが、それは(それが必要)高さ可変項目では動作しません逆のフローレイアウトでUICollectionViewを作成します。

import Foundation 
import UIKit 

class InvertedStackLayout: UICollectionViewLayout { 
    let cellHeight: CGFloat = 100 // Your cell height here... 

    override func prepare() { 
     super.prepare() 
    } 

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 
     var layoutAttrs = [UICollectionViewLayoutAttributes]() 

     if let collectionView = self.collectionView { 
      for section in 0 ..< collectionView.numberOfSections { 
       if let numberOfSectionItems = numberOfItemsInSection(section) { 
        for item in 0 ..< numberOfSectionItems { 
         let indexPath = IndexPath(item: item, section: section) 
         let layoutAttr = layoutAttributesForItem(at: indexPath) 

         if let layoutAttr = layoutAttr, layoutAttr.frame.intersects(rect) { 
          layoutAttrs.append(layoutAttr) 
         } 
        } 
       } 
      } 
     } 

     return layoutAttrs 
    } 

    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { 
     let layoutAttr = UICollectionViewLayoutAttributes(forCellWith: indexPath) 
     let contentSize = self.collectionViewContentSize 

     layoutAttr.frame = CGRect(
      x: 0, y: contentSize.height - CGFloat(indexPath.item + 1) * cellHeight, 
      width: contentSize.width, height: cellHeight) 

     return layoutAttr 
    } 

    func numberOfItemsInSection(_ section: Int) -> Int? { 
     if let collectionView = self.collectionView, 
      let numSectionItems = collectionView.dataSource?.collectionView(collectionView, numberOfItemsInSection: section) 
     { 
      return numSectionItems 
     } 

     return 0 
    } 

    override var collectionViewContentSize: CGSize { 
     get { 
      var height: CGFloat = 0 
      var bounds: CGRect = .zero 

      if let collectionView = self.collectionView { 
       for section in 0 ..< collectionView.numberOfSections { 
        if let numItems = numberOfItemsInSection(section) { 
         height += CGFloat(numItems) * cellHeight 
        } 
       } 

       bounds = collectionView.bounds 
      } 

      return CGSize(width: bounds.width, height: max(height, bounds.height)) 
     } 
    } 

    override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { 
     if let oldBounds = self.collectionView?.bounds, 
      oldBounds.width != newBounds.width || oldBounds.height != newBounds.height 
     { 
      return true 
     } 

     return false 
    } 
} 

答えて

0

あなたは回転でき(変換)collectionView 180度トップので、下部にあり、各セル180を回転(変換)して、それらを正常に見せる。

関連する問題