美文网首页iOS开发攻城狮的集散地
iOS UIWebView加载,获取WebView实际高度

iOS UIWebView加载,获取WebView实际高度

作者: hanyongwei | 来源:发表于2018-08-02 10:00 被阅读85次

    需求:一个底部UIScrollView,上面是一个UIImageView,下面是一个UIWebView,要求加载完UIWebView,禁止UIWebView滚动,UIWebView全部显示,如果大于屏幕高度,UIScrollView滚动,否则不滚动

    根据需求需要获取UIWebView的实际高度,以便设置UIScrollView的contentSize

    1加载webView

    @property (nonatomic,strong) UIWebView *webView;
    
    -(UIWebView *)webView {
        if (!_webView) {
            _webView = [[UIWebView alloc]initWithFrame:CGRectZero];
            _webView.delegate = self;
            _webView.scalesPageToFit = YES;
            _webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
            [_webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
        }
        return _webView;
    }
    

    2 当WebView加载完成后,禁止WebView滚动

    #pragma mark - UIWebViewDelegate
    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
        webView.scrollView.scrollEnabled = NO;
    }
    

    3 KVO监听webView的contentSize变化,拿到实际高度,重置约束,设置UIScrollView的contentSize

    #pragma mark - KVO
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        if ([keyPath isEqualToString:@"contentSize"]) {
            
            CGPoint point = [change[@"new"] CGPointValue];
            
            CGFloat height = point.y;
            NSLog(@"point.y---%f",height);
            
            CGSize fittingSize = [_webView sizeThatFits:CGSizeZero];
            
            CGFloat webHeight = fittingSize.height;
    
            [self.webView mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(self.topView.mas_bottom);
                make.left.right.equalTo(self.view);
                make.height.mas_equalTo(webHeight);
            }];
            self.bgScrollView.contentSize = CGSizeMake(self.view.ssWidth, self.topView.ssHeight+webHeight);
        }
    }
    

    大功告成,另外说一下为什么不在webViewDidFinishLoad中直接获取webView高度,因为如果webView中加载的有图片,如果图片显示慢了,就可能在webViewDidFinishLoad中拿不到图片高度,这样拿到的高度有可能偏低,所以我这里通过KVO拿webView高度,而不是在webViewDidFinishLoad中直接获取

    相关文章

      网友评论

        本文标题:iOS UIWebView加载,获取WebView实际高度

        本文链接:https://www.haomeiwen.com/subject/tkhjvftx.html