50 lines
2.4 KiB
Swift
50 lines
2.4 KiB
Swift
import UIKit
|
||
|
||
/// UICollectionView 数据源和自定义布局代理实现
|
||
/// 处理水平滚动和垂直滚动两种翻页模式
|
||
extension RDReaderView: UICollectionViewDataSource, RDReaderFlowLayoutDelegate, RDReaderFlowLayoutDataSoure {
|
||
/// 配置 UICollectionViewCell
|
||
/// 通过 DataSource 获取页面内容视图,支持 cell 复用和预加载视图复用
|
||
/// RTL 水平模式下翻转 cell 内容使文字方向正常
|
||
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
||
|
||
if let identifer = pageReuseIdentifier(for: indexPath.row) {
|
||
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifer, for: IndexPath(item: indexPath.row, section: 0)) as! RDReaderContentCell
|
||
let preloadedView = preloadController.takePreloadedView(for: indexPath.row)
|
||
let reusableView = cell.containerView ?? preloadedView
|
||
cell.containerView = contentViewForPage(indexPath.row, reusableView: reusableView)
|
||
// RTL 水平模式:翻转 cell 内容使文字方向正常(collectionView 已整体翻转)
|
||
if pageDirection == .rightToLeft && currentDisplayType != .verticalScroll {
|
||
cell.contentView.transform = CGAffineTransform(scaleX: -1, y: 1)
|
||
} else {
|
||
cell.contentView.transform = .identity
|
||
}
|
||
return cell
|
||
}
|
||
|
||
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: NSStringFromClass(UICollectionViewCell.self), for: indexPath)
|
||
|
||
return cell
|
||
}
|
||
|
||
/// 返回每组的 item 数量,即总页数
|
||
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
||
return numberOfPages()
|
||
}
|
||
|
||
/// 布局代理回调:当前可见页码变化时通知
|
||
public func pageNum(flowLayout: RDReaderFlowLayout, pageIndex: Int) {
|
||
if currentPage >= 0, currentPage != pageIndex {
|
||
predictedPageDirection = pageIndex >= currentPage
|
||
}
|
||
currentPage = pageIndex
|
||
primePageCache(around: pageIndex, preferredForward: predictedPageDirection)
|
||
}
|
||
|
||
/// 布局数据源回调:返回垂直滚动模式下指定页的高度
|
||
/// 当前返回 nil 使用默认高度
|
||
public func heigtOfVerticalScrollPage(flowLayout: RDReaderFlowLayout, pageIndex: Int) -> CGFloat? {
|
||
return nil
|
||
}
|
||
}
|