私の見解で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を使用してください。
私が述べたように、collectionViewはautolayoutに基づいて設定されています。したがって、コードを持っていれば、collectionViewWidthの '(0.0、0.0、0.0、0.0)'が返されます –
自動レイアウトを使用してcollectionViewを追加したところ、 viewDidLoadで幅を印刷します。何かがある場合は、viewDidLayoutSubviewsでcollectionViewlayoutを無効にしてください。コレクションビューには制約が設定されている必要があります。 – JustinM
私はコレクションビューのコードと制約を追加しました。それはちょうどそれは 'override var itemSize:CGSize'で正しいコレクションビュー値を取得しますが' sizeForItemAt'にはありません –