在编程中,有时候我们需要监测一个对象的属性的变化,那么用KVO很方便;例如:动态获取UIWebView高度;
有这样一个需求,需要将web与原生的UI搭载在一起,一般的情况下,web的高度肯定是不够的,如果原生的 UI是一个 ScrollView,高度也是不定的,那放在一起的话就会有两个 ScrollView 分别滚动,那么这样的效果是很差的;
那么解决的办法就是,web设置为不滚动,而原生的UI设置滚动,那么web的高度就要设置为web的内容的高度。这是一个我在cocoachina上放的demo,它就是这种的需求, http://code.cocoachina.com/view/133096
下面介绍使用KVO解决这种需求,(主要是解决动态拿到web的内容的高度),假如创建的UIWebView的对象是webView
//监听webView的contentSize属性变化
[webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
/**
webView的contentSize变化的时候,就回调用这个方法
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"contentSize"]) {
CGFloat height = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];
//把webView的高度设置成网页内容的高度
self.webView.frame = CGRectMake(0, CGRectGetMaxY(self.headerView.frame), self.scrollView.bounds.size.width, height);
//设置scrollView的滚动范围
self.scrollView.contentSize = CGSizeMake(0, height+CGRectGetMaxY(self.headerView.frame));
}
}