首页 > 其他分享 >OC开发,pdf自动滚动

OC开发,pdf自动滚动

时间:2024-09-18 18:25:13浏览次数:9  
标签:滚动 self OC label pdf webView 页码

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

之前是用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

相关文章

  • Qt::BlockingQueuedConnection 与 QMetaCallEvent
    Qt创建连接类型如果是Qt::BlockingQueuedConnection,即senderthread与receiverthread不同,但是要求sendersignal与receiverslot执行是不同线程间的同步行为。也即:在sendersignal发出后sender线程要等待receiver线程的slot执行完后才能继续向后执行指令。......
  • Java JNA、JNI、ProcessBuilder、Runtime.getRuntime.exec()详解
    Java提供了几种方式与非Java代码进行交互(比如调用本地库或执行外部程序),其中包括JNA、JNI、ProcessBuilder和Runtime.getRuntime().exec()。下面是对每种方式的详细解释。1.JNA(JavaNativeAccess)简介JNA是Java与本地代码进行交互的一种高层次API,它允许Java......
  • TPS61099YFFR开关稳压器原装现货PDF数据手册 引脚图功能框图参数
    TPS61099的说明TPS61099x器件是一款具有1µA超低静态电流的同步升压转换器。该器件专为由碱性电池、镍氢充电电池、锂锰电池或锂离子充电电池供电的产品而设计,能够在轻载条件下高效运行,这对延长电池使用寿命至关重要。TPS61099x升压转换器采用迟滞控制拓扑,能够以最小静......
  • TPS628501QDRLRQ1开关稳压器原装现货PDF数据手册引脚图功能框图
    TPS628501-Q1的说明TPS62850x-Q1是引脚对引脚1A、2A(持续)和3A(峰值)易用型高效同步直流/直流降压转换器系列。这些器件基于峰值电流模式控制拓扑,这些器件专为信息娱乐系统和高级驾驶辅助系统等汽车应用而设计。低阻开关可支持高达2A的持续输出电流和3A的峰值电流。TPS628......
  • Netty WebSocket 最简单的聊天室
    Netty最为后端服务处理WebSocket协议连接后端代码pom.xml<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xs......
  • BookStack在线文档管理系统本地Docker部署与远程访问详细教程
    ......
  • Transformer从入门到精通的实战指南看这本书就够了—《Transformers in Action》(附PDF
    前言TransformersinAction将革命性的Transformers架构添加到您的AI工具包中。您将深入了解模型架构的基本细节,通过易于理解的示例和巧妙的类比解释所有复杂的概念-从袜子分类到滑雪!即使是复杂的基础概念也从实际应用开始,因此您永远不必为抽象理论而苦恼。这本书包括一个广......
  • Sambruk 利用 NocoBase 实现瑞典教育资源的 GDPR 合规管理
    关于Sambruk在瑞典,有一半的城市是Sambruk的成员,并且61%的瑞典居民居住在参与Sambruk合作的市政区域内。Sambruk是一家位于瑞典的非营利组织,专注于推动和支持瑞典各地市政部门的数字化转型。其主要任务是通过协作和共享资源,帮助各个市政部门更高效地实现数字化。Sambru......
  • docker 将进程内的文件复制到物理机路径
     在实际开发过程中,经常遇到使用docker部署数据库时  很多同学未将容器的路径跟服务器路径做一个映射,从而会导致很多问题出现,因此做个记录1.使用dockerps命令可以获取docker容器中所有正在运行的容器,如下图所示 2.运行 dockerexec-it8236262ad053/bin/bash  ......
  • Docker-compose安装MySQL8.0.39
    编写DockerfileFROMmysql:8.0.39ENVTZ=Asia/ShanghaiRUNln-sf/usr/share/zoneinfo/$TZ/etc/localtime&&echo$TZ>/etc/timezone编写docker-compose.yml,与Dockerfile在同目录中services:db:build:context:./image:mysql:8.0.39......