Twitterクライアントでよく見る可変長のUITableViewCellを作成してみました。(ソース)
ざっくりと調べたところ、UILabelを用いると簡単に実装できるみたいなんですが、これの問題点はhrefなどのリンクが使えないところ。
僕のよく使ってるechofonなんかは、aタグだけじゃなく@XXXXとかもリンクで飛べる実装にしているみたいなので、これも視野に入れて実装してみたいな、と。
で作ってみた。
ざっくりと調べたところ、UILabelを用いると簡単に実装できるみたいなんですが、これの問題点はhrefなどのリンクが使えないところ。
僕のよく使ってるechofonなんかは、aタグだけじゃなく@XXXXとかもリンクで飛べる実装にしているみたいなので、これも視野に入れて実装してみたいな、と。
で作ってみた。
実装は大まかに以下のよう。
1.tableView:heightForRowAtIndexPathにとりあえずの高さ100.0を返す。
2.tableView:cellForRowAtIndexPathでUITableViewCellを作成する。高さ1のUIWebViewを作成し、loadHTMLStringでテキストを読ませておく。
3.tableViewをreloadするためにタイマーをセット
4.再度、tableView:heightForRowAtIndexPathが呼ばれるのでUIWebView.scrollView.contentSize.heightによりテキスト表示に必要な高さを取得し、呼び出しもとに返す。
5.UIWebViewのdrawRectも呼ばれるので、高さを再調整。
ソースコードの概要を説明していきます。
詳細はgithubみてください。
まずはUITableViewController
高さ可変のセルなんか需要たくさんあるだろうから、apple様に標準提供していただけるとうれしいんだけど、作り的に難しいのかなー。
詳細はgithubみてください。
まずはUITableViewController
@implementation VHTableViewController { // 省略 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { int row = [indexPath row]; VHTableViewCell *cell = [cellDict objectForKey:[NSNumber numberWithInt:row]]; if(cell == nil){ cell = [[VHTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil index:[indexPath row]]; // 一度作ったセルを覚えておく [cellDict setObject:cell forKey:[NSNumber numberWithInt:[indexPath row]]]; // 3秒後にtableViewをリロードするようにタイマーをセット。 // タイマーにしておくと、連続して再描画要求が来たときもOSがいい感じにはしょってくれてる。 [self setTableReloadTimer]; } return cell; } -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { int row = [indexPath row]; VHTableViewCell *cell = [cellDict objectForKey:[NSNumber numberWithInt:row]]; if(cell == nil){// はじめに呼ばれた場合 return 100.0; } // 二回目以降は必要な高さ return cell.webView.scrollView.contentSize.height; } // 省略 } @endんでUITableViewCell(のサブクラス)のコード 本当はUITableViewCellのサブクラス一個でこれを実現できると、使い回しが相当よかったんだけど、ちょっとやり方思いつかなかった。
高さ可変のセルなんか需要たくさんあるだろうから、apple様に標準提供していただけるとうれしいんだけど、作り的に難しいのかなー。
0 件のコメント:
コメントを投稿