可忽略文字,直接看代码。

之前是用webview加载了pdf,现在需要实现pdf自动滚动。记录下实现过程。
1、先是用GCD,每隔0.5秒就下滑20。能自动滚,但是一卡一卡的;
2、然后换成CADisplayLink,每次滑动1,顺畅多了;
3、发现手动滑动的时候,页码会变,自动滚动就不会。我猜测是因为手动时候触发的是pdf,自动滚动是操作的scrollview,所以校验不到,自动滚动过程中点一下屏幕,页码就变了;
4、开始琢磨怎么改页码,网上看到有隐藏页码的博文,借鉴了下获取页码label并隐藏的方法。去掉隐藏代码,获取到了总页数。然后复制一份该方法, 每次到新页面了调一下,修改页码label的文字;
5、测了几下,想到看看复制的方法里的label地址有没有变,发现没变,就新加个属性,删掉复制的方法,直接在新页面出来的逻辑里改页码label;
6、在滚动的方法里,加个else if,判断是不是到了新的一页。本来是用content高度除以webview高度获取页面,测了下不对,仔细观察意识到每页pdf和webview高度不一样,要改成除以pdf每页高度
7、想办法获取每页高度。去获取总页数方法里,用pdf总高度/总页数,计算并保存
8、滚动时候判断是不是新页面,如果是,修改页码。

实现方式:

-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    //延迟一点儿时间,让pdf加载完
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //获取总页数和页码label
        [self getLableForView:self.webView];
        //滚动pdf
        CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(run)];
        self.link = link;
        //屏幕刷新2次调用一次Selector
//        link.preferredFramesPerSecond = 2;
        [link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
    });
}
//遍历webView
-(void)getLableForView:(UIView*)view{
    for (UIView * subView in view.subviews) {
        if([subView isKindOfClass:[UILabel class]]){
            UILabel *l = (UILabel *)subView;
            NSArray *ary = [l.text componentsSeparatedByString:@"of"];
            NSInteger page = [ary[1] intValue];
            //获取pdf总页数
            self.pageCount = page;
            //获取页码label
            self.pageCountLabel = (UILabel *)subView;
            //每页pdf的高度
            self.pageHeight = self.webView.scrollView.contentSize.height / self.pageCount;
        }else{
            [self getLableForView:subView];
        }
    }

}
-(void)run{
    //当前偏移量
    CGFloat currentcontentOffsetY = self.webView.scrollView.contentOffset.y;
    //如果偏移量小于整个pdf总高度
    if (currentcontentOffsetY <= self.webView.scrollView.contentSize.height - self.webView.frame.size.height) {
        //滚动
        //下移一个单位。可以自行修改移动幅度
        self.webView.scrollView.contentOffset = CGPointMake(0, currentcontentOffsetY+1);

        //改页码
        //如果滚动到新的一页,且不是第一页
        if ((int)currentcontentOffsetY % (int)self.pageHeight == 0 && ((int)currentcontentOffsetY / (int)self.pageHeight) != 0){
            //当前是第几页
            int pageNum = (int)currentcontentOffsetY / (int)self.pageHeight + 1;
            //修改页码
            self.pageCountLabel.text = [NSString stringWithFormat:@"%d of %ld",pageNum,self.pageCount];
        }
    }else{
        //取消计时器
        [self.link invalidate];
        [self.link removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
        self.link = nil;
    }
}

demo:
OC版:https://download.csdn.net/download/YUEZUIQINGFENG/89770106
swift版:https://download.csdn.net/download/YUEZUIQINGFENG/89771540