修复 PDF 仿真翻页模式下翻页后页面全白
打开普通 PDF 并使用仿真翻页阅读时,除首页外每翻一页都是纯白:没有页面 内容,也没有页面四周的衬底色。横向滚动与竖滑模式不受影响。样张 英汉大词典App需求说明.pdf 上第 2 到第 9 页无一例外。 根因是页面数据回来时找不到对应的视图。UIPageViewController 会通过 viewControllerBefore/After 提前构建相邻页的内容视图,构建时页面描述尚未 就绪,configure 发起异步 readerPage 请求后先返回一张空白页。描述返回后 acceptPageDescriptor 调用 refreshVisiblePage,而它经由 RDPDFReaderView.pageContentView(pageNum:) 定位视图,该方法在仿真翻页下 只检索 nativeCurlPageController.viewControllers,也就是已经上屏的 child。 预建的 child 此时还不在其中,图片因此从未被装配上去;翻页动画结束后又 没有任何路径重新 configure 该视图,白页就固定下来。此前偶尔能看到内容, 是 OCR 完成回调顺带触发了一次刷新,并非稳定行为。 改为按页码刷新该页的全部活动视图:控制器用弱引用表记录已创建的页面视图, refreshVisiblePage 改名为 refreshPageViews(at:),除已上屏视图外一并装配 尚未上屏的预建视图,pageContentView 创建时即写入 tag 以便按页码匹配。 翻页落定时在 pageNum 回调中补一次装配,使内存告警清掉页面描述的场景也能 重新发起请求并恢复。另外把 image 为空的页面描述改按无效结果处理,走既有 的重试与失败重载入口,不再缓存出一张永远不会重试的白页。 新增 PDFPageTurnBlankPageTests 作为回归:翻页稳定后截屏统计画面中部深色 像素占比,白页为 0,扉页约 0.002,正文页在 0.01 以上,以 0.0005 为判定 阈值,覆盖仿真翻页正翻、仿真回翻和横向滚动三种路径。 验证:iPhone 17 Pro / iOS 26.4.1 模拟器执行 PDFPageTurnBlankPageTests、 PDFAnnotationTests、PDFDrawingModeTests、PageNavigationTests、 DisplayTypeTests 共 23 条用例,22 条通过。修复前仿真翻页第 2 到 9 页墨迹 占比全为 0.0000,修复后与横向滚动模式逐页吻合。唯一失败的 DisplayTypeTests.testDisplayTypeSwitchMidSession 属 EPUB 设置面板既有问题, 将本次改动还原后同样失败。文档补充了 Demo 因链接 FoundationModels 而必须 使用 iOS 26 及以上模拟器的说明。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -34,6 +34,7 @@
|
||||
| LocationPersistenceTests.swift | 阅读位置持久化 |
|
||||
| MetadataParseBenchmarkTests.swift | 元数据解析性能基准 |
|
||||
| PageNavigationTests.swift | 页面导航 |
|
||||
| PDFPageTurnBlankPageTests.swift | PDF 翻页后白页回归(截屏墨迹占比判定) |
|
||||
| ReaderAnnotationTests.swift | 标注基础功能 |
|
||||
| ReaderAnnotationExtendedTests.swift | 标注扩展功能 |
|
||||
| ReaderOpenCloseTests.swift | 阅读器打开/关闭 |
|
||||
@@ -72,6 +73,12 @@ cd ReadViewDemo && pod install
|
||||
|
||||
(依赖入口:`ReadViewDemo/Podfile`)
|
||||
|
||||
### 模拟器要求
|
||||
|
||||
Demo 链接了 `FoundationModels.framework`(AI 助手示例入口)。该框架自 iOS 26 起提供,
|
||||
在 iOS 18 及更早的模拟器上 App 会在启动时因 `Library not loaded` 直接崩溃,测试表现为
|
||||
卡在 Launch 阶段。请选择 iOS 26 及以上的模拟器运行 UI 测试。
|
||||
|
||||
### 运行 UI 测试
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user