14972


UICollectionViewを使っています。  
ボタンを押すと違う文字をセルに表示します。

以下、技術的に困っています。  
**どうか皆様のお知恵を拝借させていただけないでしょうか。**

collectionViewにおいて、その候補を表示するためのセルの幅を求めています。しかし、求めた幅になりません。  
白いボタンを押下すると別の文字列に変わり、表示も変わりそれに合わせかセル幅も変わるはずですが、この時セル幅がぐちゃぐちゃになります。  
printでウォッチしている数字は正しいようなんですが・・・

**myCollectionView.reloadData()にて更新しています。  
表示データはしっかり更新されます**。が、 **幅が正しく更新されません** 。  
正しい更新の方法（タイミングや場所、方法）を教えていただけないでしょうか？もしくは違う方法なのか？

最初の表示は以下のものです。  
"001", "0", "あい", "あいう"  
起動時の表示です。

[![画像の説明をここに入力](https://i.stack.imgur.com/Fhg41.jpg)](https://i.stack.imgur.com/Fhg41.jpg)

白いボタンを押下すると候補は以下のようになります。  
"あ", "あいう", "あ", "あいうえお"  
この時の表示です。

[![画像の説明をここに入力](https://i.stack.imgur.com/HTUIp.jpg)](https://i.stack.imgur.com/HTUIp.jpg)

表示が変わりますが、候補表示の **幅** が正しくなりません。  
その為 **セルの幅が足りず** 、表示が  
文字列によっては「...」だけ表示となってしまいます。  
のようになってしまいます。逆に幅が広いセルになる事もありますし、セルが重なる事も、離れすぎる事もあります。

どうかよろしくお願いいたします。

**シュミレーターテスト用** 、Swift2の最低限のコードは、以下の通りです。

[code]

    import UIKit
    import Foundation
    
    class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
    
        var button1: UIButton!
        var myCollectionView : UICollectionView!
        var listTest = ["001", "0", "あい", "あいう"]
        var layout = UICollectionViewFlowLayout()
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // CollectionViewのレイアウトを生成.
            let layout = UICollectionViewFlowLayout()
    
    
            // Cell一つ一つの大きさ.
            layout.itemSize = CGSizeMake(20, 20)
    
            // Cellのマージン.
            layout.sectionInset = UIEdgeInsetsMake(1, 1, 1, 1)
    
            // セクション毎のヘッダーサイズ.
            layout.headerReferenceSize = CGSizeMake(2,2)
    
            // CollectionViewを生成.
            myCollectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    
            // Cellに使われるクラスを登録.
            myCollectionView.registerClass(CustomUICollectionViewCell.self, forCellWithReuseIdentifier: "MyCell")
    
            myCollectionView.delegate = self
            print(myCollectionView.delegate)
            myCollectionView.dataSource = self
    
            self.view.addSubview(myCollectionView)
    
            self.button1 = UIButton(type: .System)
            self.button1 = UIButton(frame: CGRectMake(50, 50, 50,50))
            self.button1.setTitleColor(UIColor.blackColor(), forState: .Normal)
            self.button1.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
            self.button1.layer.cornerRadius = 5   //角丸
            self.button1.layer.borderWidth = 1     //枠線
            self.button1.addTarget(self, action: "btnUp1:", forControlEvents:.TouchUpInside)
            self.button1.addTarget(self, action: "btnDown1:", forControlEvents:.TouchDown)
    
            self.view.addSubview(self.button1)
        }
    
        func btnDown1(sender: UIButton){
    
        }
    
        func btnUp1(sender: AnyObject){
            listTest = []
            listTest = ["あ", "あいう", "あ", "あいうえお"]
            myCollectionView.reloadData()
        }
    
        // 幅を決める関数
        func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
            let size: CGSize = listTest[indexPath.row].sizeWithAttributes([NSFontAttributeName: UIFont.systemFontOfSize(20.0)])
            print(CGSizeMake(size.width + 20.0, 25))
            return CGSizeMake(size.width + 20.0, 25) //self.flowLayout.itemSize.height)
        }
    
        /*
        Cellが選択された際に呼び出される
        */
        func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    
            print("Num: \(indexPath.row)")
    
        }
    
        /*
        Cellの総数を返す
        */
        func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return 4
        }
    
        /*
        Cellに値を設定する
        */
        func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    
            let cell : CustomUICollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! CustomUICollectionViewCell
            cell.textLabel?.text = listTest[indexPath.row]
    
            return cell
        }
    }
    
    class CustomUICollectionViewCell : UICollectionViewCell{
    
        var textLabel : UILabel?
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    
        override init(frame: CGRect) {
            super.init(frame: frame)
    
            // UILabelを生成.
            textLabel = UILabel(frame: CGRectMake(0, 0, frame.width, frame.height))
            textLabel?.text = "nil"
            textLabel?.backgroundColor = UIColor.whiteColor()
            textLabel?.textAlignment = NSTextAlignment.Center
    
            // Cellに追加.
            self.contentView.addSubview(textLabel!)
        }
    
    }
    
[/code]


CC BY-SA 3.0
2015-08-26T04:43:16.770
14851
2015-10-16T16:08:48.560
2015-10-16T16:08:48.560
5519
10845
question
ios swift xcode
Swift2：UICollectionViewで、カスタムセルの幅が正しく更新されない。正しく表示するには?

[code]

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell : CustomUICollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! CustomUICollectionViewCell
        cell.textLabel?.text = listTest[indexPath.row]
    
        cell.textLabel?.sizeToFit()
    
        return cell
    }
    
[/code]

とりあえずタイミングだけならこんな感じではないでしょうか。


CC BY-SA 3.0
2015-08-28T14:34:51.497
14972
2015-08-28T14:34:51.497
4369
14851
answer