From 529663829fffc972b0ff3d62975808e69c0e0e3e Mon Sep 17 00:00:00 2001 From: shenlei Date: Thu, 30 Jul 2026 18:03:43 +0900 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=80=80=E5=87=BA=20EPUB=20?= =?UTF-8?q?=E9=98=85=E8=AF=BB=E5=99=A8=E5=90=8E=E5=AE=BF=E4=B8=BB=E4=BE=A7?= =?UTF-8?q?=E6=BB=91=E8=BF=94=E5=9B=9E=E6=89=8B=E5=8A=BF=E8=A2=AB=E6=94=B9?= =?UTF-8?q?=E6=88=90=E9=98=85=E8=AF=BB=E5=99=A8=E7=9A=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 阅读器在 viewWillAppear 中无条件把导航控制器的 interactivePopGestureRecognizer 接管为自己的 delegate 并强制开启,退出时却不做任何还原。宿主如果原本关闭了 侧滑返回,或为它设置过自定义 delegate,从阅读器返回后这些配置就被永久改写, 其它页面的返回手势行为随之变化。阅读器自身接管横向翻页,进入期间开启侧滑返回 也会与翻页手势争抢边缘触摸。 改为进入时记录原有的开关状态与 delegate 并直接关闭该手势,退出时按记录值还原。 记录只在首次 viewWillAppear 时进行,避免阅读器内部多次前后台切换把自己写入的 状态当成宿主原值。 该修复原本以本地补丁形式存在于 readoor 项目的 Vendor 副本中,现回流上游,避免 后续同步 SDK 时反复丢失。 Co-Authored-By: Claude Opus 5 --- .../EPUBUI/RDEPUBReaderController.swift | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController.swift b/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController.swift index b50a702..cffc4d5 100644 --- a/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController.swift +++ b/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController.swift @@ -157,6 +157,10 @@ public final class RDEPUBReaderController: UIViewController { /// 阅读器进入前宿主导航栏的真实状态。详情页使用自定义导航栏时系统栏原本 /// 就是隐藏的,退出阅读器必须恢复该状态,不能无条件显示系统导航栏。 private var navigationBarHiddenBeforeReader: Bool? + /// 阅读器进入前宿主侧滑返回手势的真实状态。阅读器自己接管横向翻页, + /// 期间必须关闭该手势;退出时按原值恢复,不能把宿主的配置改成阅读器的。 + private var interactivePopWasEnabledBeforeReader: Bool? + private weak var interactivePopDelegateBeforeReader: UIGestureRecognizerDelegate? private(set) var isSearchBarVisible = false @@ -287,9 +291,12 @@ public final class RDEPUBReaderController: UIViewController { if navigationBarHiddenBeforeReader == nil { navigationBarHiddenBeforeReader = navigationController?.isNavigationBarHidden } + if interactivePopWasEnabledBeforeReader == nil { + interactivePopWasEnabledBeforeReader = navigationController?.interactivePopGestureRecognizer?.isEnabled + interactivePopDelegateBeforeReader = navigationController?.interactivePopGestureRecognizer?.delegate + } navigationController?.setNavigationBarHidden(true, animated: animated) - navigationController?.interactivePopGestureRecognizer?.delegate = self - navigationController?.interactivePopGestureRecognizer?.isEnabled = true + navigationController?.interactivePopGestureRecognizer?.isEnabled = false } public override func viewWillDisappear(_ animated: Bool) { @@ -300,6 +307,10 @@ public final class RDEPUBReaderController: UIViewController { animated: animated ) } + if let interactivePopWasEnabledBeforeReader { + navigationController?.interactivePopGestureRecognizer?.delegate = interactivePopDelegateBeforeReader + navigationController?.interactivePopGestureRecognizer?.isEnabled = interactivePopWasEnabledBeforeReader + } } public override func viewDidAppear(_ animated: Bool) {