カスタムセル(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が無限ループするので注意です!