可忽略文字,直接看代码。
之前是用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;
}
}
标签:滚动,self,OC,label,pdf,webView,页码
From: https://www.cnblogs.com/xiao-xiao-/p/18418948