カスタムセル(UITableViewCell)に配置したWebViewの高さを調整する方

ちょっとはまったので、久しぶりにブログでも書こうかなと。

TestTableViewCell.xib

UITableViewCellにUIWebViewを配置します。

TestTableViewCell.h

delegateを定義してます。また、UIWebViewDelegateを実装してます。

@protocol TestTableViewCellDelegate <NSObject>
- (void)reloadTable:(NSInteger)height;
@end
@interface TestTableViewCell : UITableViewCell<UIWebViewDelegate>
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@property (weak, nonatomic)id<TestTableViewCellDelegate> delegate;
@end
TestTableViewCell.m

UIWebViewDelegateの実装します。また、この中でTestTableViewCellDelegate#reloadTableのdelegateをcallしてます。

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *output = [webView  stringByEvaluatingJavaScriptFromString: @"document.documentElement.clientHeight;"];
    int contentHeight = [output intValue];
    [self.delegate reloadTable:contentHeight];
}
TestTableViewController.h

webviewの高さを保持しておく変数を定義しておきます。

@interface TestTableViewController : UITableViewController<TestTableViewCellDelegate>
@property int height;

TestTableViewController.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *Cell = @"Cell";
  PMSShopDetailFreeText *cell = [tableView dequeueReusableCellWithIdentifier:Cell forIndexPath:indexPath];
  // delegate設定
  cell.delegate = self;
	// webviewの読み込み
  NSMutableString *htmlCode = [NSMutableString stringWithString:@"<html><head>"];
  [htmlCode appendString:@"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"];
  [htmlCode appendString:@"</head><body>"];
  [htmlCode appendString:@"test"];
  [htmlCode appendString:@"</body><html>"];
  [cell.freeTextWebView loadHTMLString:htmlCode baseURL:nil];

  return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return height;
}
// 高さを設定してtableviewを更新
// ※reloadDataを使うと無限ループするので注意!!
- (void)reloadTable:(NSInteger)height
{
    freeTextHeight = height;
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

こんな感じにすると、以下の順番でdelegateが呼ばれて無事高さを設定できます。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- (void)webViewDidFinishLoad:(UIWebView *)webView
- (void)reloadTable:(NSInteger)height


ちなみに、

- (void)reloadTable:(NSInteger)height

で、reloadDataを使うと、上記順番のdelegateが無限ループするので注意です!


Androidのブログだったけど、最近はRubyとObjectiveCばっかりやってます。。