2016-10-30 11 views
0

コレクションビューを作成しました。最初のセルは最初のセルを3行、3番目のセルは2行目を埋めなければなりませんこれは、毎回私がsizeForItemAtでやろうとしているので、collectionViewフレームが(0, 0, 0, 0)であることがわかります。ここで異なるセルサイズと制約に基づくコレクションビュー

は、私は同様のを持っていた私は

func createCollectionView() { 
    let layout = FlowLayout() 
    layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) 
    layout.numberOfCells = 2 



    collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout) 
    collectionView.dataSource = self 
    collectionView.delegate = self 
    collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell") 
    collectionView.backgroundColor = UIColor.white 
    collectionView.isScrollEnabled = false 
    self.topWrapperView.addSubview(collectionView) 


    collectionView.snp.makeConstraints { (make) -> Void in 

     make.left.equalTo(topWrapperView).offset(0) 
     make.top.equalTo(topWrapperView).offset(0) 
     make.bottom.equalTo(topWrapperView).offset(0) 
     make.right.equalTo(topWrapperView).offset(0) 
    } 
} 

enter image description here

答えて

1

私の見解でcollectionViewを設定したいものの私は、現時点では持っているもの

class FlowLayout: UICollectionViewFlowLayout { 

    var numberOfCells: Int! 

    override init() { 
     super.init() 
     setupLayout() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setupLayout() 
    } 

    func setupLayout() { 
     minimumInteritemSpacing = 1 
     minimumLineSpacing = 1 

    } 

    override var itemSize: CGSize { 
     set { 

     } 
     get { 
      let numberOfColumns: CGFloat = 2 

      let itemWidth = (self.collectionView!.frame.width - (numberOfColumns - 1))/numberOfColumns 
      let itemHeight = self.collectionView!.frame.height/2 


      return CGSize(width: itemWidth, height: itemHeight) 
     } 
    } 


} 

図でありますそれ以外の状況では、最初のセルが2つのセルを必要としていた最初の行は3行後になります。画像のコレクションビューで主要な写真とバイオに使用しました。私は正常にそれを実装しましたsizeForItemAtIndexPath既定のUICollectionViewDelegateFlowLayout。ここ はあなたの状況のた​​めに働くべきものである。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 

let insets = collectionView.contentInset 
let collectionViewWidth = collectionView.frame.width - (insets.left + insets.right + 1) 
let collectionViewHeight = collectionView.frame.height - (insets.top + insets.bottom) 

    switch indexPath.row { 
    case 0, 1: 

    return CGSize(width: collectionViewWidth/2, height: collectionViewHeight/2) 

    default: 
    return CGSize(width: collectionViewWidth, height: collectionViewHeight/2) 
    } 
} 

あなたが希望得るために高さによって高さを分けるものを変更することができます。

これは私が自分の状況のた​​めに書いたもので、あなたや他の読者を助けることができるように投稿します。あなたはそれが、回転に変更viewWillTransitionを使用してdidSetリスナーでブールフラグを設定する場合:

var isPortraitOrientation: Bool = true { 
    didSet { 
if oldValue != isPortraitOrientation { 
    collectionView?.collectionViewLayout.invalidateLayout() 
    } 
    } 
} 

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
    super.viewWillTransition(to: size, with: coordinator) 
    isPortraitOrientation = (size.width - size.height) <= 0 ? true : false 
} 


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 

    let insets = collectionView.contentInset 
    let collectionViewWidth = collectionView.frame.width - (insets.left + insets.right + 1) 
    let collectionViewHeight = collectionView.frame.height - (insets.top + insets.bottom) 

    switch indexPath.row { 
    case 0: 

     if textViewSelected { 
      return isPortraitOrientation ? CGSize(width: collectionViewWidth, height: collectionViewHeight/2) : CGSize(width: collectionViewWidth, height: collectionViewWidth/3) 
     } else { 
      return isPortraitOrientation ? CGSize(width: collectionViewWidth/2, height: collectionViewWidth/2) : CGSize(width: collectionViewWidth/2, height: collectionViewHeight/1.5) 
     } 
    case 1: 
     return isPortraitOrientation ? CGSize(width: collectionViewWidth/2, height: collectionViewWidth/2) : CGSize(width: collectionViewWidth/2, height: collectionViewHeight/1.5) 

    default: 
     return isPortraitOrientation ? CGSize(width: collectionViewWidth/3, height: collectionViewWidth/3) : CGSize(width: collectionViewWidth/5, height: collectionViewWidth/5) 
    } 
} 

EDIT:

代わりcollectionViewフレーム用CGRect.zeroを行うので、あなたの追加のコードに基づいてtopWrapperView.boundsを使用してください。

+0

私が述べたように、collectionViewはautolayoutに基づいて設定されています。したがって、コードを持っていれば、collectionViewWidthの '(0.0、0.0、0.0、0.0)'が返されます –

+0

自動レイアウトを使用してcollectionViewを追加したところ、 viewDidLoadで幅を印刷します。何かがある場合は、viewDidLayoutSubviewsでcollectionViewlayoutを無効にしてください。コレクションビューには制約が設定されている必要があります。 – JustinM

+0

私はコレクションビューのコードと制約を追加しました。それはちょうどそれは 'override var itemSize:CGSize'で正しいコレクションビュー値を取得しますが' sizeForItemAt'にはありません –

関連する問題