| 测试已测试 | ✗ |
| 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 文件。