18919


UITableViewCell について質問があります。  
UITableViewCellStyle.Subtitle を使用して、detailTextLabel を表現する際、  
複数行に渡る文字列について、行の高さを動的に変更することができません。

Storyboad で cell に UILabel を配置して AutoLayout
をすることで動的に高さを変更するケースはよく見られるのですが、下記のとおり detailTextLabel
を使用して、高さを動的に変更する表現はできるのでしょうか。

[code]

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath:  NSIndexPath) -> UITableViewCell {
        let identifier = "Cell"
        var cell: UITableViewCell?
        // セルを再利用する。
        cell = tableView.dequeueReusableCellWithIdentifier(identifier)
        if cell == nil {
            cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: identifier)
        }
        cell?.textLabel?.text = "テスト"
        cell?.detailTextLabel?.text = "あいうえおかきくけこさしすせそなにぬねのはひふへほあいうえおかきくけこさしすせそなにぬねのはひふへほ"
    
        return cell!
    }
    
[/code]

よろしくお願いします。


CC BY-SA 3.0
2015-11-16T12:18:34.870
18904
2015-11-17T01:20:07.833
6103
question
swift xcode
UITableViewCellのdetailTextLabel値が複数行にわたる際に、UITableViewCellの高さの動的変更について


[Quite -
UITableViewCellの高さを動的に変更する（初心者向け）](http://qiita.com/kotaroito/items/8bd2f10833e07f7a5809)

こちらの記事を参考にして、こういうプログラムを作ってみました。  
考え方は、NSString Class (UIKit Additions)
の`boundingRectWithSize()`メソッドを使って、テキストを表示するのに必要な矩型サイズを求め、それから行の高さを計算するというものです。`detailTextLabel`の高さを求め、それに`textLabel`の高さと、マージンを加えて、行の高さとしています。

_UITableViewDelegate_

[code]

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        let text: NSString = myDetailText as NSString // myDetailTextは、detailTextLabelに入力するテキスト。NSStringにキャストする。
        let labelWidth = tableView.bounds.size.width - 30.0 // 30.0は適当。正しくdetailTextLabelの幅を計算してください。
        let maxSize = CGSize(width: labelWidth, height: CGFloat.max)
        let attribute = [NSFontAttributeName: UIFont.systemFontOfSize(11.0)] // デフォルトのdetailTextLabelのフォントとそのサイズ。これも適切な値にしてください。
        let size = text.boundingRectWithSize(maxSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: attribute, context: nil).size
    
        return size.height + 28.0 // この28.0も適当な数字。
    }
    
[/code]

_正直言わせてもらうと、`UITableViewCell`のサブクラスを作って、`UILabel`を`addSubview()`して、Constraintをかけて、ってやる方が、楽だと思いました。_


CC BY-SA 3.0
2015-11-17T01:20:07.833
18919
2015-11-17T01:20:07.833
7362
18904
answer