测试已测试 | ✗ |
Lang语言 | SwiftSwift |
许可证 | MIT |
发布上次发布 | 2016年9月 |
SPM支持 SPM | ✗ |
由 Suyeol Jeon 维护。
依赖 | |
RxCocoa | ~> 2.5 |
RxSwift | ~> 2.5 |
RxSwift 中的 UITableView Cell 高度和 UICollectionView Cell 大小。
如果您正在使用 RxSwift 与 UITableView
或 UICollectionView
一起,由于 TableView
需要同步计算 cell 高度,但 Observable
是异步发出值,因此很难使用 Observable
计算 cell 大小。
例如,假设我们正在使用 MVVM 模式,并且有一个 ViewModel 公开了一个 message
,其值为 Driver
。我们需要将实际的消息值作为 String
来计算 cell 高度。然而,由于 message
是异步发出值,我们无法同步访问实际值。
struct MyCellModel {
let message: Driver<String>
}
func tableView(tableView: UITableView, heightForRowAtIndexPath: NSIndexPath) -> CGFloat {
let cellViewModel = self.dataSource.itemAtIndexPath(indexPath)
cellModel.message // (1) This is `Driver<String>`
.map { message -> CGFloat in
let size = CGSize(width: tableView.width - 20, height: .max)
let options: NSStringDrawingOptions = [.UsesLineFragmentOrigin, .UsesFontLeading]
let attributes = [NSFontAttributeName: MyCell.Font.messageLabel]
let rect = message.boundingRectWithSize(size, options: options, attributes: attributes, context: nil)
return ceil(rect.height) + 20 // (2) We want return this value (async)
}
return 40 // (3) But we have to return actual value here, synchronously :(
}
RxDelegateCells 允许您使用 Driver<CGFloat>
作为 UITableView cell 的高度以及使用 Driver<CGSize>
作为 UICollectionView cell 的大小。
以下代码将 cell 高度设置为 40,80 和 120。
Driver.just([[.just(40), .just(80), .just(120)]])
.drive(self.tableView.rx_cellHeightWithDelegate(delegate))
.addDisposableTo(self.disposeBag)
您可以在这里找到实际的示例。
适用于 iOS 8+ 项目且使用 CocoaPods
pod 'RxDelegateCells', '~> 0.1'
适用于 iOS 8+ 项目且使用 Carthage
github "devxoul/RxDelegateCells" ~> 0.1
适用于 iOS 7 项目且使用 CocoaSeeds
github 'devxoul/RxDelegateCells', '0.1.0', :files => 'Sources/**/*.swift'
使用 Swift 包管理器:
import PackageDescription
let package = Package(
name: "MyAwesomeApp",
dependencies: [
.Package(url: "https://github.com/devxoul/RxDelegateCells", "0.1.0"),
]
)
RxDelegateCells 在 MIT 许可证下。有关更多信息,请参阅LICENSE 文件。