-
需求
- 界面由两部分构成,上部分显示图片,下部分显示文字,由于服务器是分开返回图片及HTML,并且滚动文字的时候,图片要跟随滚动
-
解决方法
- 通过UITableView展示图片及文字(主要是为了需求更改的时候,更改UITableView会更简单),这样就涉及到动态改变UIWebView的高度
-
实现细节
@interface PrizeDetailsViewController () <UIWebViewDelegate>
@property (weak, nonatomic) IBOutlet UIWebView *webView;
/**
* webViewH
*/
@property (nonatomic, assign) CGFloat webViewH;
@end
@implementation PrizeDetailsViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self setupUI];
}
- (void)setupUI {
self.webView.backgroundColor = [UIColor clearColor];
// 禁止webView滚动
self.webView.scrollView.showsHorizontalScrollIndicator = NO;
self.webView.scrollView.showsVerticalScrollIndicator = NO;
self.webView.userInteractionEnabled = NO;
self.webView.delegate = self;
NSString *tmpStr = @"<h6>每个环境中有不同的bundleID、bundleName和app图标。这样做可以确保您可以直接识别安装在设备上的不同版本。也许更重要的是,它能够使我们在设备上有多个不同的版本,因为在每个环境中都有自己的bundleID</h6>";
// 监听webView的contentSize改变的时候,更新tableView
[self.webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
[self.webView loadHTMLString:tmpStr baseURL:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
self.webViewH = [change[@"new"] CGSizeValue].height;
[self.tableView reloadData];
}
// 添加了观察者,在控制器销毁的时候,一定要移除观察者
- (void)dealloc {
[self.webView.scrollView removeObserver:self forKeyPath:@"contentSize"];
}
#pragma mark webViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {
self.webViewH = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
[self.tableView reloadData];
}
#pragma mark - tableView
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 1) {
return self.webViewH;
}
return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}
@end
remark: 以上代码仅是列出比较重要的步骤,各位大神们有什么好的意见,欢迎讨论
网友评论