UIWebView高度自适应(基于KVO)
2017-04-05 本文已影响180人
calary
1.前言
最近项目用到加载html文本,所以就想到了用webView来实现,用他来实现当然没有任何问题,直接一行代码就可以加载进来,刚开始高度是写死的UIScrollView里面嵌套了UIWebView,体验不是太好,两块区域滑动。后来想到让webView高度自适应好了,查资料后感觉用KVO解决应该是最好的方法,所以就用KVO来解决了。
2.知识铺垫
-
KVO:KVO 作为 iOS 中一种强大并且有效的机制,我们可以使用 KVO 来检测对象属性的变化、快速做出响应,这能够为我们在开发强交互、响应式应用以及实现视图和模型的双向绑定时提供大量的帮助。
但是KVO的使用有太多的不便利,使用 KVO 时,既需要进行注册成为某个对象属性的观察者,还要在合适的时间点将自己移除,再加上需要覆写一个又臭又长的方法,并在方法里判断这次是不是自己要观测的属性发生了变化 -
解决:如何优雅地解决上一节提出的几个问题呢?我们在这里只需要使用 Facebook 开源的 KVOController 框架就可以优雅地解决这些问题了。
-
具体参考如何优雅地使用KVO
3.具体使用
主要代码
#import <KVOController/KVOController.h>
//...
@property (nonatomic, strong) UIScrollView *mScrollView;
@property (nonatomic, strong) UIWebView *mWebView;
@property (nonatomic, strong) FBKVOController *kvoController;
//...
_mScrollView = [[UIScrollView alloc] init];
_mScrollView.delegate = self;
_mScrollView.contentSize = CGSizeMake(ScreenWidth, ScreenHeight);
[self.view addSubview:_mScrollView];
_mWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 390, ScreenWidth, 100)];
_mWebView.delegate = self;
_mWebView.scalesPageToFit = YES;//自动缩放
_mWebView.opaque = NO;
_mWebView.backgroundColor = [UIColor whiteColor];
_mWebView.userInteractionEnabled = NO;//禁止交互,如果可以缩放拉大的话,会影响高度
[_mScrollView addSubview:_mWebView];
/***webView高度自适应***/
__weak typeof (self) weakSelf = self;
//KVO
self.kvoController = [FBKVOController controllerWithObserver:self];
[self.kvoController observe:_mWebView.scrollView keyPath:@"contentOffset" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *,id> * _Nonnull change) {
//获取尺寸
CGSize fitSize = [_mWebView sizeThatFits:CGSizeZero];
weakSelf.mScrollView.contentSize = CGSizeMake(ScreenWidth, fitSize.height + 390);
CGRect rect = weakSelf.mWebView.frame;
rect.size.height = fitSize.height;
//重新设置高度
weakSelf.mWebView.frame = rect;
}];
//网络获取的html
[_mWebView loadHTMLString:_model.descri baseURL:nil];
4.总结
用KVO实时监听高度的变化然后动态改变webView的高度,这个方法怎么样呢,希望对你有所帮助!