UITableView 中的多个 UIWebViews 不是一个好的做法。但是有时我们想在短时间内构建一个应用程序,UIWebView 对我们来说是一个非常方便的类。
就我而言,我设置了一个自定义 UITableViewCell
CustomTableViewCell.h
#import <UIKit/UIKit.h>
@interface VerticalTableViewCell : UITableViewCell
@property (nonatomic,retain) UIWebView * webView;
-(void)setWebViewContent:(NSString *)htmlContent andIndex:(NSString *)row;
@end
CustomTableViewCell.m
#import "CustomTableViewCell.h"
@interface CustomTableViewCell()
@end
@implementation VerticalTableViewCell
@synthesize webView;
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
if (self) {
self.webView = [[UIWebView alloc]init];
[self.webView setFrame:self.contentView.frame];
[self.webView setUserInteractionEnabled:NO];
[self.contentView addSubview:self.webView];
}
return self;
}
-(void)setWebViewContent:(NSString *)htmlContent andIndex:(NSString *)row
{
[self.webView loadHTMLString:[NSString stringWithFormat:@"<html><head></head><body><div style='width:414px;height:414px;background-image:url(%@);background-size:414px 414px;'></div><p>现在是第%@排</p></body></html>",htmlContent,row] baseURL:nil];
}
- (void) layoutSubviews
{
[super layoutSubviews];
CGRect contentViewFrame = self.contentView.frame;
contentViewFrame.size.width = [[UIScreen mainScreen] bounds].size.width;
contentViewFrame.size.height = 586.0f;
self.contentView.frame = contentViewFrame;
self.webView.frame = contentViewFrame;
}
-(void)dealloc
{
[self.webView loadHTMLString:nil baseURL:nil];
self.webView = nil;
}
@end
自定义表格视图.m
...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CMainCell = @"CMainCell";
CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CMainCell];
if (cell == nil) {
cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier: CMainCell];
//自定义cell的内容
}
if (self.whiteData!=nil) {
NSString * row = [NSString stringWithFormat:@"%ld",indexPath.row];
[cell setWebViewContent:self.whiteData[indexPath.row] andIndex:row];
//[cell setCustomImage:self.whiteData[indexPath.row]];
}
return cell;
}
-(void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomTableViewCell * customCell = (CustomTableViewCell *)cell;
[customCell.webView loadHTMLString:nil baseURL:nil];
}
...
你可以看到我使用的方法:
-(void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
在这个方法中,当tableView中的cell不可见时,cells会将webViews设置为空。
在我们的案例中,由于 UITableView Reuse 特性,cells 不会清理 contentViews。因此用户以非常快速的方式滚动 tableView,cells 将被重用并且 HTML 内容仍然存在。如果我们清理 contentView,效果很好。
但是这里还有一个问题。因为单元格在进入可见区域时应该渲染HTML内容。UIWebView的渲染速度不是很快,所以我们应该编写一些代码来优化渲染过程。
希望这会帮助你。干杯。