【iPhone 開発 Swift Objective-c】行の高さを動的に変更する
UITableViewの行の高さを中に貼ったラベルの文字数に応じて動的に変更したい場合があります。
知ってしまえば簡単なのですが、苦労してやっと解決しました。
リアル・ネットともにヒントを下さった方に本当に感謝します。
同じような問題に出会った方が私のように苦しまず、あっさり進んでくれたら幸せです。
お役に立てればと思い共有します。
The value of a man should be seen in what he gives and not in what he is able to receive. by Albert Einstein
UITableViewの行の高さを中に貼ったラベルの文字数に応じて動的に変更したい場合があります。
知ってしまえば簡単なのですが、苦労してやっと解決しました。
リアル・ネットともにヒントを下さった方に本当に感謝します。
同じような問題に出会った方が私のように苦しまず、あっさり進んでくれたら幸せです。
お役に立てればと思い共有します。
スポンサーリンク
iOS7と8 、XCode6です。ソースをSwift, Objective-c丸ごと全部公開します。
1〜1万行までテストし問題なく動作しました。ぴったり表示します!
iOS8以降のみ対応すれば良いということであれば未検証ですが、UITableViewAutomaticDimensionを使用するととても簡単にできるみたいなのでそちらを使ったほうがよいかもれません。
ラベルの制約は上左右で下は付けません。
Linesは本来0設定するべきですが、iOS7,8両対応しようとするので警告が出るのでとりあえず1にしておき後からコードで0を設定し直します。
LineBreaks=CharacterWrap、今回はソース内のラベルの特定はタグを使用してますのでTag=1を指定します。
あとはソースの記述です。肝となる関数は2つです
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<pre class="lang:default decode:true">func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell var label = cell.viewWithTag(1) as UILabel label.numberOfLines = 0 label.text = "" + "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" return cell } </pre> |
・・・ラベルをタグに指定した番号で特定し、文字を入れます。
StotyBordでLinesを1にしたので無限行であることを示す0に設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { let text = "" + "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" let font = UIFont.systemFontOfSize(17) let bounds = CGSizeMake(self.view.frame.size.width - 16, CGFloat.max) let attributes = [NSFontAttributeName: font] let options = unsafeBitCast(NSStringDrawingOptions.UsesLineFragmentOrigin.rawValue | NSStringDrawingOptions.UsesFontLeading.rawValue, NSStringDrawingOptions.self) let rect:CGRect = text.boundingRectWithSize(bounds, options: options, attributes: attributes, context: nil) var size:CGSize? = CGSize(width: rect.size.width, height: rect.size.height) var height = size?.height if height! + 20 > 70 { return height! + 20 } else { return 70 } } |
・・・1つめの関数と同じ文字列で矩形を作り、その高さを返します。
let bounds = CGSizeMake(self.view.frame.size.width – 16, CGFloat.max)の−16はストーリーボードで指定した制約の左と右の横幅の固定空白です。
2015/01/21 | iPhone, iPhoneアプリ開発, XCode iOS, UITableView, 行の高さ
コメント/トラックバック
トラックバック用URL:
この投稿のコメント・トラックバックRSS