KVO监测对象属性的改变

2016-09-30  本文已影响0人  zhouios

在编程中,有时候我们需要监测一个对象的属性的变化,那么用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));
        
    }
}
上一篇 下一篇

猜你喜欢

热点阅读