Swift2:UICollectionViewで、カスタムセルの幅が正しく更新されない。正しく表示するには?
UICollectionViewを使っています。
ボタンを押すと違う文字をセルに表示します。
以下、技術的に困っています。
どうか皆様のお知恵を拝借させていただけないでしょうか。
collectionViewにおいて、その候補を表示するためのセルの幅を求めています。しかし、求めた幅になりません。
白いボタンを押下すると別の文字列に変わり、表示も変わりそれに合わせかセル幅も変わるはずですが、この時セル幅がぐちゃぐちゃになります。
printでウォッチしている数字は正しいようなんですが・・・
myCollectionView.reloadData()にて更新しています。
表示データはしっかり更新されます。が、幅が正しく更新されません。
正しい更新の方法(タイミングや場所、方法)を教えていただけないでしょうか?もしくは違う方法なのか?
最初の表示は以下のものです。
"001", "0", "あい", "あいう"
起動時の表示です。
白いボタンを押下すると候補は以下のようになります。
"あ", "あいう", "あ", "あいうえお"
この時の表示です。
表示が変わりますが、候補表示の幅が正しくなりません。
その為セルの幅が足りず、表示が
文字列によっては「...」だけ表示となってしまいます。
のようになってしまいます。逆に幅が広いセルになる事もありますし、セルが重なる事も、離れすぎる事もあります。
どうかよろしくお願いいたします。
シュミレーターテスト用、Swift2の最低限のコードは、以下の通りです。
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!)
}
}