• iOS WKWebView 获取内容高度 去掉pdf页码


    最近遇到使用UITableView嵌套WKWebView的场景,
    实现原理:禁用WKWebView的滑动功能,在WKWebView加载完后,得到高度,并更改WKWebView的frame,,然后将WKWebView作为tableview的cell展示

    1.获取内容高度

    在得到WKWebView的内容具体高度的实现中,有多种方案,比如KVC监听WKWebView里的scrollview的contentsize,,,但发现这个方法在iPhoneX等高端机型和新系统中,会失效,于是用了另一种方法:代理

    WKWebView 的WKNavigationDelegate代理有个方法
    // 页面内容加载完成之后调用

    - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    }


    注意了,这个只是WKWebView的内容加载完,,,就像刚把文件下载成功,,,还没有真的显示到WKWebView里面,所以这个时候获取的webView.scrollView.contentSize.height为0;

    解决方案:延迟获取

    - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
        [self performSelector:@selector(changeWebViewHeight) withObject:nil afterDelay:0.5f];
    }
    
    -(void)changeWebViewHeight{
    [self hideLableForView:self.webView];
        self.webView.frame = CGRectMake(0, 0,self.view.bounds.size.width,self.webView.scrollView.contentSize.height);
        [self.tableView reloadData];
        [LoadingView closeLoading];//结束加载
    }

    像这样写,就能准确的获取到加载到界面的contentSize,,,具体延迟时间,可以根据内容大小增加或减少

    2.去除页码

    因为我们是在加载本地的pdf文件,发现改了webview的frame后,左上角的页码显示不是从1开始,,,,,于是想改这个页码,没找到改的地方,,,于是就想着屏蔽,,,

    重点:在内容加载到webview里面的界面后!,这时页数已经定下,,,页码lable已经显示出来,就可以影藏他,,,,一定要在我们的延迟方法后,,在代理方法里面影藏都不行,可能那个时候lab还没加上,亲测早一点都不行。

    影藏方法:因为没有具体的API和入口供我们操控,,,再加上通过运行时的界面层级查看,发现整个webview里面只有这个显示页码的控件是UILabel,于是使用简单粗暴的方法:屏蔽调webview里的UILabel控件,通过下面的遍历方法就可实现

    -(void)hideLableForView:(UIView*)view{
        for (UIView * subView in view.subviews) {
            if([subView isKindOfClass:[UILabel class]]){
                subView.hidden = YES;
            }else{
                [self hideLableForView:subView];
            }
        }
    }

    下面是具体demo的代码,

    #import "ViewController.h"
    #import <WebKit/WebKit.h>
    
    @interface ViewController ()<WKNavigationDelegate,WKUIDelegate,UITableViewDelegate,UITableViewDataSource>
    @property (nonatomic, strong) UITableView *tableView;
    @property (strong, nonatomic) WKWebView *webView;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        
    
           UIButton * btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
           btn.backgroundColor = [UIColor redColor];
           [btn addTarget:self action:@selector(tap) forControlEvents:UIControlEventTouchUpInside];
           [self.view addSubview:btn];
     }
    -(void)tap{
            self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(0,0, self.view.bounds.size.width, self.view.bounds.size.height) style:UITableViewStyleGrouped];
            _tableView.dataSource = self;
            _tableView.delegate = self;
            self.tableView.showsHorizontalScrollIndicator = NO;
            self.tableView.showsVerticalScrollIndicator = NO;
            self.tableView.separatorStyle = 0;
            
    
            _webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 1)];
            self.webView.navigationDelegate = self;
            self.webView.UIDelegate = self;
            self.webView.scrollView.scrollEnabled = NO;
            NSString *filepath = [[NSBundle mainBundle] pathForResource:@"AppleUpReadMe" ofType:@"pdf"];
            [self.webView loadFileURL:[NSURL fileURLWithPath:filepath] allowingReadAccessToURL:[NSURL fileURLWithPath:filepath]];
            
            
            [self.view addSubview:_tableView];
            
        }
    
    
    // 页面加载完成之后调用
    - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
        [self performSelector:@selector(changeWebViewHeight) withObject:nil afterDelay:0.5f];
    }
    
    
    -(void)hideLableForView:(UIView*)view{
        for (UIView * subView in view.subviews) {
            if([subView isKindOfClass:[UILabel class]]){
                subView.hidden = YES;
            }else{
                [self hideLableForView:subView];
            }
        }
    }
    
    -(void)changeWebViewHeight{
        [self hideLableForView:self.webView];
        self.webView.frame = CGRectMake(0, 0,self.view.bounds.size.width,self.webView.scrollView.contentSize.height);
        [self.tableView reloadData];
    }
    
    
    
    - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
        return [[UIView alloc] init];
    }
    
    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
         return [[UIView alloc] init];
    }
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return 1;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
        return 0.01f;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
        return 0.01f;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
            static NSString *identifier = @"cell";
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
            if (!cell){
                cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
                [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
            }
            [cell.contentView addSubview:_webView];
            return cell;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
    {
        return _webView.frame.size.height;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }

    点个赞再走呗。。。

    如有疑问,联系作者 

    博客园:这个我不知道诶

  • 相关阅读:
    CentOS7如何升级ruby版本
    多线程面试题:现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?(转载)
    hive举例实现字数统计
    hive单用户模式安装
    hadoop实例:电子商务网站商品推荐系统
    安装hadoop-eclipse-plugin 插件(win7)
    hadoop高可用分布式集群安装HDFS +yarm
    hadoop伪分布式安装(单机版) HDFS +Yarn
    Hadoop理论原理
    小技巧:oracle锁表杀进程
  • 原文地址:https://www.cnblogs.com/Yongersblog/p/13231594.html
Copyright © 2020-2023  润新知