You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
4.2 KiB
113 lines
4.2 KiB
// |
|
// SportDetailViewControllers.swift |
|
// Lookfit |
|
// |
|
// Created by lemo. on 2020/4/13. |
|
// Copyright © 2020 Sheldon. All rights reserved. |
|
// |
|
|
|
import UIKit |
|
|
|
fileprivate struct Metric { |
|
static let indexItemSize: CGSize = CGSize(width: (kScreenW - 80) / 2.0, height: kScaleHeight(83)) |
|
} |
|
fileprivate enum Resuable { |
|
static let headerView = ReusableView<UICollectionReusableView>() |
|
static let headerHeight = kScaleHeight(193) |
|
static let gpsHeaderHeight = kScaleHeight(193 + 380) |
|
static let sportDetailCell = ReusableCell<SportDetailCell>(nibName: "SportDetailCell") |
|
} |
|
|
|
class SportDetailViewControllers: ViewController { |
|
|
|
private lazy var headerView: SportDetailHeaderView = { |
|
let view = SportDetailHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenW, height: kScaleHeight(193) + kScaleHeight(380))) |
|
view.backgroundColor = .white |
|
return view |
|
}() |
|
private lazy var rxDataSource: RxCollectionViewSectionedReloadDataSource = { |
|
return RxCollectionViewSectionedReloadDataSource<SectionModel<String, SportDetailCellViewModels>>( |
|
configureCell: { (dataSource, collectionView, indexPath, element) in |
|
let cell = collectionView.dequeue(Resuable.sportDetailCell, for: indexPath) |
|
cell.bind(to: element) |
|
return cell |
|
}, |
|
configureSupplementaryView: { [weak self] (_, cv, kind, ip) in |
|
let headerView = cv.dequeue(Resuable.headerView, kind: .header, for: ip) |
|
guard let `self` = self else { return headerView } |
|
if self.headerView.superview == nil { |
|
headerView.frame = self.headerView.frame |
|
headerView.addSubview(self.headerView) |
|
} |
|
self.flowLayout.headerReferenceSize = CGSize(width: kScreenW, height: self.headerView.height) |
|
return headerView |
|
}) |
|
}() |
|
|
|
private lazy var flowLayout: UICollectionViewFlowLayout = { |
|
let flowLayout = UICollectionViewFlowLayout().then { |
|
$0.itemSize = Metric.indexItemSize |
|
$0.sectionInset = UIEdgeInsets(top: 0, left: 39, bottom: 0, right: 39) |
|
} |
|
flowLayout.minimumInteritemSpacing = 0 |
|
flowLayout.minimumLineSpacing = 0 |
|
flowLayout.headerReferenceSize = CGSize(width: kScreenW, height: Resuable.headerHeight) |
|
return flowLayout |
|
}() |
|
|
|
private lazy var collectionView: UICollectionView = { |
|
|
|
let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: flowLayout).then({ |
|
$0.backgroundColor = .white |
|
$0.showsVerticalScrollIndicator = false |
|
$0.register(Resuable.headerView, kind: .header) |
|
$0.register(Resuable.sportDetailCell) |
|
}) |
|
return collectionView |
|
}() |
|
|
|
override func viewDidLoad() { |
|
super.viewDidLoad() |
|
} |
|
|
|
override func makeUI() { |
|
super.makeUI() |
|
view.backgroundColor = kHexColor(0xFAFAFA) |
|
view.addSubview(collectionView) |
|
layoutUI() |
|
} |
|
|
|
func layoutUI() { |
|
collectionView.snp.makeConstraints { (make) in |
|
make.edges.equalToSuperview() |
|
} |
|
} |
|
|
|
override func bindViewModel() { |
|
super.bindViewModel() |
|
guard let viewModel = viewModel as? SportDetailViewModels else { return } |
|
|
|
let output = viewModel.transform(input: SportDetailViewModels.Input()) |
|
output.items |
|
.bind(to: collectionView.rx.items(dataSource: rxDataSource)) |
|
.disposed(by: rx.disposeBag) |
|
if let leftItemBtn = navigationItem.leftBarButtonItem?.customView as? UIButton { |
|
output.sportName |
|
.drive(leftItemBtn.rx.title(for: .normal)) |
|
.disposed(by: rx.disposeBag) |
|
} |
|
output.time |
|
.drive(headerView.timeLabel.rx.text) |
|
.disposed(by: rx.disposeBag) |
|
output.distance |
|
.drive(headerView.distanceLabel.rx.text) |
|
.disposed(by: rx.disposeBag) |
|
output.distanceUnit |
|
.drive(headerView.distanceUnitLabel.rx.text) |
|
.disposed(by: rx.disposeBag) |
|
output.trajectory |
|
.drive(headerView.rx.trajectory()) |
|
.disposed(by: rx.disposeBag) |
|
} |
|
|
|
}
|
|
|