fix epub reader playback and trial navigation

This commit is contained in:
shen
2026-07-11 08:16:56 +08:00
parent d7fcda345d
commit 063a493b18
231 changed files with 435 additions and 36060 deletions
@@ -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 }