// // RDReaderView+CollectionView.swift // ReadViewSDK // // 文件职责:UICollectionView 数据源和自定义布局代理实现,处理水平滚动和垂直滚动两种翻页模式。 // 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 } }