web-dev-qa-db-ja.com

Swift、UICollectionViewCellとUILabel(セル内)の幅をプログラムで変更する

セルの幅(UICollectionViewCell)をUICollectionViewの幅と等しくなるように設定し、そのセル内に含まれているUILabelでまったく同じことを実行しようとしています。以下のコードは、私が達成しようとしていることを正確に説明していると思います。だから私はここSOといくつかのチュートリアルでいくつかの質問を読みましたが、どうすればこれを達成できるかまだわかりません。

いくつかの質問でcollectionViewLayoutの使用について言っていましたが、コード内での使用方法に本当に苦労しています。何か案は?ありがとうございました!

_func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    var cell = collectionView.dequeueReusableCellWithReuseIdentifier("myCell", forIndexPath: indexPath) as LocationViewCell
    cell.locationLabel.text = "Hello there!"

    // Set cell & label width to 100%
    let collectionViewWidth = self.collectionView.bounds.size.width
    cell.frame.size.width = collectionViewWidth // Works
    cell.locationLabel.frame.size.width = collectionViewWidth // Does NOT 
_

アップデート1

だから私は以下を追加しました:

_func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    // Set cell width to 100%
    let collectionViewWidth = self.collectionView.bounds.size.width
    return CGSize(width: collectionViewWidth, height: 35)
}
_

ビューがロードされたとき、UILabelの幅はまだ小さいということが起こります。別のビューに移動してから戻ると、100%です。だから私はviewDidLoad()で何かをしなければなりませんよね?私はすでにself.collectionView.reloadData()を使用していますが、これはデータ専用だと思います。

アップデート2

_func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    var cell = collectionView.dequeueReusableCellWithReuseIdentifier("locationCell", forIndexPath: indexPath) as LocationViewCell
    cell.locationLabel.text = "Hello UILabel"

    // Set cell width to 100%
    let collectionViewWidth = self.collectionView.bounds.size.width
    cell.frame.size.width = collectionViewWidth
    cell.locationLabel.frame.size.width = collectionViewWidth

    return cell
}
_
8
manosim

このメソッドが呼び出されるまでに、コレクションビューは、フローデリゲートメソッドからセルを取得しているため、セルの大きさをすでに認識しているため、機能しません。

optional func collectionView(_ collectionView: UICollectionView,
                  layout collectionViewLayout: UICollectionViewLayout,
             sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize

ここで、セルのサイズを設定する必要があります。

19
Abizern