修复退出 EPUB 阅读器后宿主侧滑返回手势被改成阅读器的配置
阅读器在 viewWillAppear 中无条件把导航控制器的 interactivePopGestureRecognizer 接管为自己的 delegate 并强制开启,退出时却不做任何还原。宿主如果原本关闭了 侧滑返回,或为它设置过自定义 delegate,从阅读器返回后这些配置就被永久改写, 其它页面的返回手势行为随之变化。阅读器自身接管横向翻页,进入期间开启侧滑返回 也会与翻页手势争抢边缘触摸。 改为进入时记录原有的开关状态与 delegate 并直接关闭该手势,退出时按记录值还原。 记录只在首次 viewWillAppear 时进行,避免阅读器内部多次前后台切换把自己写入的 状态当成宿主原值。 该修复原本以本地补丁形式存在于 readoor 项目的 Vendor 副本中,现回流上游,避免 后续同步 SDK 时反复丢失。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -157,6 +157,10 @@ public final class RDEPUBReaderController: UIViewController {
|
|||||||
/// 阅读器进入前宿主导航栏的真实状态。详情页使用自定义导航栏时系统栏原本
|
/// 阅读器进入前宿主导航栏的真实状态。详情页使用自定义导航栏时系统栏原本
|
||||||
/// 就是隐藏的,退出阅读器必须恢复该状态,不能无条件显示系统导航栏。
|
/// 就是隐藏的,退出阅读器必须恢复该状态,不能无条件显示系统导航栏。
|
||||||
private var navigationBarHiddenBeforeReader: Bool?
|
private var navigationBarHiddenBeforeReader: Bool?
|
||||||
|
/// 阅读器进入前宿主侧滑返回手势的真实状态。阅读器自己接管横向翻页,
|
||||||
|
/// 期间必须关闭该手势;退出时按原值恢复,不能把宿主的配置改成阅读器的。
|
||||||
|
private var interactivePopWasEnabledBeforeReader: Bool?
|
||||||
|
private weak var interactivePopDelegateBeforeReader: UIGestureRecognizerDelegate?
|
||||||
|
|
||||||
private(set) var isSearchBarVisible = false
|
private(set) var isSearchBarVisible = false
|
||||||
|
|
||||||
@@ -287,9 +291,12 @@ public final class RDEPUBReaderController: UIViewController {
|
|||||||
if navigationBarHiddenBeforeReader == nil {
|
if navigationBarHiddenBeforeReader == nil {
|
||||||
navigationBarHiddenBeforeReader = navigationController?.isNavigationBarHidden
|
navigationBarHiddenBeforeReader = navigationController?.isNavigationBarHidden
|
||||||
}
|
}
|
||||||
|
if interactivePopWasEnabledBeforeReader == nil {
|
||||||
|
interactivePopWasEnabledBeforeReader = navigationController?.interactivePopGestureRecognizer?.isEnabled
|
||||||
|
interactivePopDelegateBeforeReader = navigationController?.interactivePopGestureRecognizer?.delegate
|
||||||
|
}
|
||||||
navigationController?.setNavigationBarHidden(true, animated: animated)
|
navigationController?.setNavigationBarHidden(true, animated: animated)
|
||||||
navigationController?.interactivePopGestureRecognizer?.delegate = self
|
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
|
||||||
navigationController?.interactivePopGestureRecognizer?.isEnabled = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override func viewWillDisappear(_ animated: Bool) {
|
public override func viewWillDisappear(_ animated: Bool) {
|
||||||
@@ -300,6 +307,10 @@ public final class RDEPUBReaderController: UIViewController {
|
|||||||
animated: animated
|
animated: animated
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
if let interactivePopWasEnabledBeforeReader {
|
||||||
|
navigationController?.interactivePopGestureRecognizer?.delegate = interactivePopDelegateBeforeReader
|
||||||
|
navigationController?.interactivePopGestureRecognizer?.isEnabled = interactivePopWasEnabledBeforeReader
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override func viewDidAppear(_ animated: Bool) {
|
public override func viewDidAppear(_ animated: Bool) {
|
||||||
|
|||||||
Reference in New Issue
Block a user