fix epub reader playback and trial navigation
This commit is contained in:
@@ -162,9 +162,12 @@ final class RDEPUBReaderContext {
|
||||
environment.currentLayoutContext(configuration: configuration)
|
||||
}
|
||||
|
||||
func currentPreferences() -> RDEPUBPreferences {
|
||||
let safeInsets = RDEPUBSafeArea.resolve(controller?.view.safeAreaInsets)
|
||||
return configuration.makePreferences(safeAreaInsets: safeInsets)
|
||||
func currentPreferences(pageIndex: Int? = nil) -> RDEPUBPreferences {
|
||||
environment.currentPreferences(configuration: configuration, pageIndex: pageIndex)
|
||||
}
|
||||
|
||||
func currentTextContentInsets(pageIndex: Int) -> UIEdgeInsets {
|
||||
currentPreferences(pageIndex: pageIndex).reflowableContentInsets
|
||||
}
|
||||
|
||||
/// Captures all layout parameters needed for background chapter loading.
|
||||
|
||||
@@ -10,14 +10,59 @@ enum RDEPUBTextPageLayoutMetrics {
|
||||
|
||||
static func contentInsets(
|
||||
configuration: RDEPUBReaderConfiguration,
|
||||
safeAreaInsets: UIEdgeInsets
|
||||
safeAreaInsets: UIEdgeInsets,
|
||||
isLandscapeDualPage: Bool = false,
|
||||
isLeadingPage: Bool = true
|
||||
) -> UIEdgeInsets {
|
||||
let configInsets = configuration.reflowableContentInsets
|
||||
guard isLandscapeDualPage else {
|
||||
return UIEdgeInsets(
|
||||
top: max(configInsets.top, safeAreaInsets.top),
|
||||
left: max(configInsets.left, safeAreaInsets.left),
|
||||
bottom: max(configInsets.bottom, safeAreaInsets.bottom) + pageNumberReservedHeight,
|
||||
right: max(configInsets.right, safeAreaInsets.right)
|
||||
)
|
||||
}
|
||||
|
||||
let outerHorizontalInset = max(
|
||||
max(configInsets.left, configInsets.right),
|
||||
max(safeAreaInsets.left, safeAreaInsets.right)
|
||||
)
|
||||
let spineInset = RDEpubReaderView.landscapeDualPageGap / 2
|
||||
return UIEdgeInsets(
|
||||
top: max(configInsets.top, safeAreaInsets.top),
|
||||
left: max(configInsets.left, safeAreaInsets.left),
|
||||
bottom: max(configInsets.bottom, safeAreaInsets.bottom) + pageNumberReservedHeight,
|
||||
right: max(configInsets.right, safeAreaInsets.right)
|
||||
top: max(safeAreaInsets.top, min(configInsets.top, RDEPUBSafeArea.landscapeVerticalTextMargin)),
|
||||
left: isLeadingPage ? outerHorizontalInset : spineInset,
|
||||
bottom: max(safeAreaInsets.bottom, min(configInsets.bottom, RDEPUBSafeArea.landscapeVerticalTextMargin)) + pageNumberReservedHeight,
|
||||
right: isLeadingPage ? spineInset : outerHorizontalInset
|
||||
)
|
||||
}
|
||||
|
||||
static func fixedContentInsets(
|
||||
configuration: RDEPUBReaderConfiguration,
|
||||
safeAreaInsets: UIEdgeInsets,
|
||||
isLandscapeDualPage: Bool,
|
||||
isLeadingPage: Bool
|
||||
) -> UIEdgeInsets {
|
||||
let configInsets = configuration.fixedContentInset
|
||||
guard isLandscapeDualPage else {
|
||||
return UIEdgeInsets(
|
||||
top: max(configInsets.top, safeAreaInsets.top),
|
||||
left: max(configInsets.left, safeAreaInsets.left),
|
||||
bottom: max(configInsets.bottom, safeAreaInsets.bottom),
|
||||
right: max(configInsets.right, safeAreaInsets.right)
|
||||
)
|
||||
}
|
||||
|
||||
let outerHorizontalInset = max(
|
||||
max(configInsets.left, configInsets.right),
|
||||
max(safeAreaInsets.left, safeAreaInsets.right)
|
||||
)
|
||||
let spineInset = RDEpubReaderView.landscapeDualPageGap / 2
|
||||
return UIEdgeInsets(
|
||||
top: max(safeAreaInsets.top, min(configInsets.top, RDEPUBSafeArea.landscapeVerticalTextMargin)),
|
||||
left: isLeadingPage ? outerHorizontalInset : spineInset,
|
||||
bottom: max(safeAreaInsets.bottom, min(configInsets.bottom, RDEPUBSafeArea.landscapeVerticalTextMargin)),
|
||||
right: isLeadingPage ? spineInset : outerHorizontalInset
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -74,7 +119,8 @@ final class RDEPUBReaderEnvironment {
|
||||
frameHeight: max(pageSize.height, 1),
|
||||
edgeInsets: RDEPUBTextPageLayoutMetrics.contentInsets(
|
||||
configuration: configuration,
|
||||
safeAreaInsets: safeAreaInsets
|
||||
safeAreaInsets: safeAreaInsets,
|
||||
isLandscapeDualPage: readerView?.pagesPerScreen == 2
|
||||
),
|
||||
numberOfColumns: configuration.numberOfColumns,
|
||||
columnGap: configuration.columnGap,
|
||||
@@ -87,6 +133,29 @@ final class RDEPUBReaderEnvironment {
|
||||
)
|
||||
}
|
||||
|
||||
func currentPreferences(
|
||||
configuration: RDEPUBReaderConfiguration,
|
||||
pageIndex: Int? = nil
|
||||
) -> RDEPUBPreferences {
|
||||
let safeAreaInsets = RDEPUBSafeArea.resolve(controller?.view.safeAreaInsets)
|
||||
let isLandscapeDualPage = readerView?.pagesPerScreen == 2
|
||||
let isLeadingPage = pageIndex.map { readerView?.isLeadingPage($0) ?? true } ?? true
|
||||
var preferences = configuration.makePreferences(safeAreaInsets: safeAreaInsets)
|
||||
preferences.reflowableContentInsets = RDEPUBTextPageLayoutMetrics.contentInsets(
|
||||
configuration: configuration,
|
||||
safeAreaInsets: safeAreaInsets,
|
||||
isLandscapeDualPage: isLandscapeDualPage,
|
||||
isLeadingPage: isLeadingPage
|
||||
)
|
||||
preferences.fixedContentInset = RDEPUBTextPageLayoutMetrics.fixedContentInsets(
|
||||
configuration: configuration,
|
||||
safeAreaInsets: safeAreaInsets,
|
||||
isLandscapeDualPage: isLandscapeDualPage,
|
||||
isLeadingPage: isLeadingPage
|
||||
)
|
||||
return preferences
|
||||
}
|
||||
|
||||
var currentBrightness: CGFloat {
|
||||
get { displayEnvironment.currentBrightness }
|
||||
set { displayEnvironment.currentBrightness = newValue }
|
||||
|
||||
+4
-1
@@ -297,6 +297,9 @@ final class RDEPUBReaderSearchCoordinator {
|
||||
private func notifySearchStateChanged() {
|
||||
guard let controller else { return }
|
||||
let state = controller.searchState
|
||||
// 搜索在后台队列执行,结果落地后需要同步刷新搜索面板计数;
|
||||
// 否则正文高亮已更新时,列表仍可能停留在“搜索中”或空状态。
|
||||
controller.updateSearchCount()
|
||||
controller.delegate?.epubReader(controller, didUpdateSearchResult: state?.result)
|
||||
controller.delegate?.epubReader(controller, didChangeCurrentSearchMatch: state?.currentMatch)
|
||||
}
|
||||
@@ -411,4 +414,4 @@ final class RDEPUBReaderSearchCoordinator {
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user