web-dev-qa-db-ja.com

SwiftでプログラムでUICollectionViewCellのサイズを変更するにはどうすればよいですか?

データを切り替えるsegmented controlを持つUICollectionViewがあります。しかし、UICollectionViewCellサイズプロパティをプログラムで変更するにはどうすればよいですか?その後、各データ型に合わせて各スタイルを適切にカスタマイズできます。

たとえば、幅を520ポイントに、高さを100に変更します。私はiOS開発の初心者で、CSSの経験があります:/

私はXcodeでそれを行う方法を知っています(明らかに)が、Swiftでそれを変更する正しい方法を知りません。アイデアやフィードバックは大歓迎です(Y)

enter image description here

48
RileyDev

クラスのUICollectionViewDelegateFlowLayoutに準拠していることを確認してください(Swift4の場合)

eg. class MyClass: UICollectionViewDelegateFlowLayout

Swift 3より前

//Use for size
func collectionView(collectionView: UICollectionView,
        layout collectionViewLayout: UICollectionViewLayout,
        sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

    }
//Use for interspacing
    func collectionView(collectionView: UICollectionView,
        layout collectionViewLayout: UICollectionViewLayout,
        minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
            return 1.0
    }

    func collectionView(collectionView: UICollectionView, layout
        collectionViewLayout: UICollectionViewLayout,
        minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
            return 1.0
    }

// Swift 3の場合

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

}

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0
}

func collectionView(_ collectionView: UICollectionView, layout
    collectionViewLayout: UICollectionViewLayout,
                    minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0
}

// Swift 4の場合

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

        }

        func collectionView(_ collectionView: UICollectionView,
                            layout collectionViewLayout: UICollectionViewLayout,
                            minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
            return 1.0
        }

        func collectionView(_ collectionView: UICollectionView, layout
            collectionViewLayout: UICollectionViewLayout,
                            minimumLineSpacingForSectionAt section: Int) -> CGFloat {
            return 1.0
        }
    }

Swift 3に対して上記と同じコードを使用しますが、単にクラスがプロトコルUICollectionViewDelegateFlowLayoutに準拠していることを確認してください

90
Sumit Oberoi

Swift

@ sumit-oberoi answerのメソッド呼び出されない Swiftを使用している場合3.動作させるには、次の調整を行います。

  1. UICollectionViewDelegateFlowLayoutプロトコルに準拠します。

  2. これらのメソッドを実装します。

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {
    
    }
    
    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 1.0
    }
    
    func collectionView(_ collectionView: UICollectionView, layout
        collectionViewLayout: UICollectionViewLayout,
                        minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 1.0
    }
    

変更に注意してください:

  1. メソッド名のcollectionViewの前に_を追加します
  2. NSIndexPathIndexPathに変更されます
61
JPetric

Swift

override func viewDidLoad() {
    super.viewDidLoad()

    let cellSize = CGSize(width:80 , height:80)

    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .vertical //.horizontal
    layout.itemSize = cellSize
    layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
    layout.minimumLineSpacing = 1.0
    layout.minimumInteritemSpacing = 1.0
    myCollectionView.setCollectionViewLayout(layout, animated: true)

    myCollectionView.reloadData()
}
31
Gaurav Rami

gaurav Ramiのコードを使用する場合

let cellSize = CGSize(width:80 , height:80)

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical //.horizontal
layout.itemSize = cellSize
layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
layout.minimumLineSpacing = 1.0
layout.minimumInteritemSpacing = 1.0
myCollectionView.setCollectionViewLayout(layout, animated: true)

レンダリングされていないビューのスナップショットは空のスナップショットになります。スナップショットの前または画面更新後のスナップショットの前にビューが少なくとも1回レンダリングされていることを確認してください。」コレクションビューのビューレイアウトを設定するときにアニメーションを削除する必要があります

myCollectionView.setCollectionViewLayout(layout, animated: false)

その後、メッセージが消えます

6
first Conform protocol the UICollectionViewDelegateFlowLayout

set width and height  UICollectionViewCell 

UIcollectionViewCell Hight = 300;
UIcollectionViewCell Width = 380;

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout,sizeForItemAt indexPath: IndexPath) -> CGSize {
      return CGSize(width: CGFloat((380)), height: CGFloat(300))
    }
0
Ananda Aiwale