|
|
|
//
|
|
|
|
// HealthStepItemCell.swift
|
|
|
|
// FireBoltt
|
|
|
|
//
|
|
|
|
// Created by Sheldon on 2021/9/19.
|
|
|
|
// Copyright © 2021 Sheldon. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import UIKit
|
|
|
|
|
|
|
|
class HealthStepItemCell: CollectionViewCell {
|
|
|
|
|
|
|
|
lazy var fb_titleLabel: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.textColor = kHexColor(0x2A2A2A)
|
|
|
|
label.font = SystemMediumFont(18)
|
|
|
|
label.text = MultiLanguageKey_FB.stepFB.localized
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
lazy var fb_dateLabel: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.textColor = kHexColor(0x888888)
|
|
|
|
label.font = SystemRegularFont(12)
|
|
|
|
label.text = DateClass.timestampToStr(Int(Date().timeIntervalSince1970), formatStr: "yyyy/MM/dd")
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
lazy var fb_bgView: UIView = {
|
|
|
|
let view = UIView()
|
|
|
|
// view.gradient(colors: [kHexColor(0x59AAFF), kHexColor(0x2B75FF)], locations: nil, autoLaoutFrame: CGRect(x: 0, y: 0, width: kScaleWidth(335), height: kScaleWidth(160)))
|
|
|
|
view.gradient(colors: [.white, .white], locations: nil, autoLaoutFrame: CGRect(x: 0, y: 0, width: kScaleWidth(335), height: kScaleWidth(160)))
|
|
|
|
view.layer.cornerRadius = 10
|
|
|
|
view.layer.masksToBounds = true
|
|
|
|
return view
|
|
|
|
}()
|
|
|
|
|
|
|
|
/// 步数
|
|
|
|
lazy var stepProgress:XFGradientProgressView = {
|
|
|
|
let view = XFGradientProgressView(frame: CGRect(x: 18, y: 30, width: 115, height: 115), start: kRGBA(35, 128, 255, 1), end: kRGBA(35, 128, 255, 1), backProgressColor: kRGBA(35, 128, 255, 0.4))
|
|
|
|
view!.startAnimation(toProgress: 0, durationTime: 0, sImgName: "icon_step")
|
|
|
|
return view!
|
|
|
|
}()
|
|
|
|
|
|
|
|
/// 热量
|
|
|
|
lazy var distanceProgress:XFGradientProgressView = {
|
|
|
|
let view = XFGradientProgressView(frame: CGRect(x: stepProgress.left+12.5, y: stepProgress.top+10, width: stepProgress.width-25, height: stepProgress.height-20), start: kRGBA(253, 161, 40, 1), end: kRGBA(253, 161, 40, 1), backProgressColor: kRGBA(253, 161, 40, 0.4))
|
|
|
|
view!.startAnimation(toProgress: 0, durationTime: 0, sImgName: "icon_distance")
|
|
|
|
return view!
|
|
|
|
}()
|
|
|
|
|
|
|
|
/// 总里程
|
|
|
|
lazy var calorieProgress:XFGradientProgressView = {
|
|
|
|
let view = XFGradientProgressView(frame: CGRect(x: distanceProgress.left+12.5, y: distanceProgress.top+10, width: distanceProgress.width-25, height: distanceProgress.height-19), start: kRGBA(255, 0, 96, 1), end: kRGBA(255, 0, 96, 1), backProgressColor: kRGBA(255, 0, 96, 0.4))
|
|
|
|
view!.startAnimation(toProgress: 0, durationTime: 0, sImgName: "icon_calories")
|
|
|
|
return view!
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
|
|
// lazy var fb_stepCircleView: CircleView = {
|
|
|
|
// let view = CircleView(lineWidth: 8, bottomColor: kHexColor(0xFFFFFF, 0.3), progressColor: kHexColor(0xFFFFFF), type: .doubleLine)
|
|
|
|
// return view
|
|
|
|
// }()
|
|
|
|
|
|
|
|
/// 步数
|
|
|
|
lazy var fb_stepValue: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.font = DigitalFont(25)
|
|
|
|
label.textColor = kRGBA(42, 42, 42, 1)
|
|
|
|
label.text = "0"
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
|
|
|
|
/// 步数单位
|
|
|
|
lazy var fb_stepUnit: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.font = SystemRegularFont(12)
|
|
|
|
label.textColor = kRGBA(133, 133, 133, 1)
|
|
|
|
label.text = MultiLanguageKey_FB.stepTipFB.localized
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
// lazy var fb_dataCircleView: CircleView = {
|
|
|
|
// let view = CircleView(lineWidth: 2, bottomColor: kHexColor(0xfffff, 0.3), type: .dottedLine)
|
|
|
|
// return view
|
|
|
|
// }()
|
|
|
|
|
|
|
|
/// 千卡数据
|
|
|
|
lazy var fb_stepCaloriesValue: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.font = DigitalFont(25)
|
|
|
|
label.textColor = kRGBA(42, 42, 42, 1)
|
|
|
|
label.text = "0"
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
/// 公里数据
|
|
|
|
lazy var fb_stepDistanceValue: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.font = DigitalFont(25)
|
|
|
|
label.textColor = kRGBA(42, 42, 42, 1)
|
|
|
|
label.text = "0"
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
|
|
|
|
/// 千卡单位
|
|
|
|
lazy var fb_stepCalories: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.font = SystemRegularFont(12)
|
|
|
|
label.textColor = kRGBA(133, 133, 133, 1)
|
|
|
|
label.text = MultiLanguageKey_FB.kcalFB.localized
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
|
|
|
|
/// 公里单位
|
|
|
|
lazy var fb_stepDistance: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.font = SystemRegularFont(12)
|
|
|
|
label.textColor = kRGBA(133, 133, 133, 1)
|
|
|
|
label.text = MultiLanguageKey_FB.kmFB.localized
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
|
|
|
|
/// 线条
|
|
|
|
lazy var line: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.backgroundColor = kRGBA(235, 235, 235, 1)
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
lazy var line1: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.backgroundColor = kRGBA(235, 235, 235, 1)
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
|
|
|
|
/// 圆点
|
|
|
|
lazy var point: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.backgroundColor = kRGBA(88, 157, 245, 1)
|
|
|
|
label.layer.cornerRadius = 2.5
|
|
|
|
label.layer.masksToBounds = true
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
lazy var point1: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.backgroundColor = kRGBA(255, 0, 96, 1)
|
|
|
|
label.layer.cornerRadius = 2.5
|
|
|
|
label.layer.masksToBounds = true
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
lazy var point2: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.backgroundColor = kRGBA(253, 161, 40, 1)
|
|
|
|
label.layer.cornerRadius = 2.5
|
|
|
|
label.layer.masksToBounds = true
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
|
|
|
|
/// 问题提示
|
|
|
|
lazy var tlabel: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.font = SystemRegularFont(13)
|
|
|
|
label.textColor = kRGBA(42, 42, 42, 1)
|
|
|
|
label.text = MultiLanguageKey_FB.stepNumberFB.localized
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
lazy var tlabel1: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.font = SystemRegularFont(13)
|
|
|
|
label.textColor = kRGBA(42, 42, 42, 1)
|
|
|
|
label.text = MultiLanguageKey_FB.heatFB.localized
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
lazy var tlabel2: UILabel = {
|
|
|
|
let label = UILabel()
|
|
|
|
label.font = SystemRegularFont(13)
|
|
|
|
label.textColor = kRGBA(42, 42, 42, 1)
|
|
|
|
label.text = MultiLanguageKey_FB.totalDistanceFB.localized
|
|
|
|
return label
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// override init(frame: CGRect) {
|
|
|
|
// super.init(frame: frame)
|
|
|
|
// selectionStyle = .none
|
|
|
|
|
|
|
|
// containerView.addSubview(titleLabel)
|
|
|
|
// containerView.addSubview(dateLabel)
|
|
|
|
// containerView.addSubview(bgView)
|
|
|
|
// bgView.addSubview(stepCircleView)
|
|
|
|
// bgView.addSubview(dataCircleView)
|
|
|
|
// stepCircleView.addSubview(stepValue)
|
|
|
|
// stepCircleView.addSubview(stepUnit)
|
|
|
|
// dataCircleView.addSubview(stepCaloriesValue)
|
|
|
|
// dataCircleView.addSubview(stepDistanceValue)
|
|
|
|
// dataCircleView.addSubview(stepCalories)
|
|
|
|
// dataCircleView.addSubview(stepDistance)
|
|
|
|
// layoutUI()
|
|
|
|
// }
|
|
|
|
|
|
|
|
// required init?(coder: NSCoder) {
|
|
|
|
// fatalError("init(coder:) has not been implemented")
|
|
|
|
// }
|
|
|
|
|
|
|
|
override func setUpUI() {
|
|
|
|
containerView.addSubview(fb_titleLabel)
|
|
|
|
containerView.addSubview(fb_dateLabel)
|
|
|
|
containerView.addSubview(fb_bgView)
|
|
|
|
// fb_bgView.addSubview(fb_stepCircleView)
|
|
|
|
// fb_bgView.addSubview(fb_dataCircleView)
|
|
|
|
fb_bgView.addSubview(stepProgress)
|
|
|
|
fb_bgView.addSubview(distanceProgress)
|
|
|
|
fb_bgView.addSubview(calorieProgress)
|
|
|
|
|
|
|
|
fb_bgView.addSubview(fb_stepValue)
|
|
|
|
fb_bgView.addSubview(fb_stepUnit)
|
|
|
|
fb_bgView.addSubview(fb_stepCaloriesValue)
|
|
|
|
fb_bgView.addSubview(fb_stepDistanceValue)
|
|
|
|
fb_bgView.addSubview(fb_stepCalories)
|
|
|
|
fb_bgView.addSubview(fb_stepDistance)
|
|
|
|
|
|
|
|
fb_bgView.addSubview(line)
|
|
|
|
fb_bgView.addSubview(line1)
|
|
|
|
fb_bgView.addSubview(point)
|
|
|
|
fb_bgView.addSubview(point1)
|
|
|
|
fb_bgView.addSubview(point2)
|
|
|
|
fb_bgView.addSubview(tlabel)
|
|
|
|
fb_bgView.addSubview(tlabel1)
|
|
|
|
fb_bgView.addSubview(tlabel2)
|
|
|
|
}
|
|
|
|
|
|
|
|
override func layoutUI() {
|
|
|
|
fb_titleLabel.snp.makeConstraints { (make) in
|
|
|
|
make.top.equalTo(kScaleWidth(20))
|
|
|
|
make.left.equalTo(25)
|
|
|
|
}
|
|
|
|
fb_dateLabel.snp.makeConstraints { (make) in
|
|
|
|
make.bottom.equalTo(fb_titleLabel.snp.bottom)
|
|
|
|
make.right.equalTo(-25)
|
|
|
|
}
|
|
|
|
fb_bgView.snp.makeConstraints { (make) in
|
|
|
|
make.top.equalTo(fb_titleLabel.snp.bottom).offset(10)
|
|
|
|
make.left.equalTo(20)
|
|
|
|
make.right.equalTo(-20)
|
|
|
|
make.height.equalTo(kScaleWidth(160))
|
|
|
|
}
|
|
|
|
// fb_stepCircleView.snp.makeConstraints { (make) in
|
|
|
|
// make.centerY.equalToSuperview()
|
|
|
|
// make.width.height.equalTo(kScaleWidth(130))
|
|
|
|
// make.left.equalTo(kScaleWidth(28))
|
|
|
|
// }
|
|
|
|
fb_stepUnit.snp.makeConstraints { (make) in
|
|
|
|
make.top.equalTo(fb_bgView)
|
|
|
|
make.right.equalTo(fb_bgView.snp_right).inset(18.5)
|
|
|
|
make.height.equalTo(kScaleWidth(160)/3)
|
|
|
|
}
|
|
|
|
|
|
|
|
fb_stepValue.snp.makeConstraints { (make) in
|
|
|
|
make.centerY.equalTo(fb_stepUnit)
|
|
|
|
make.right.equalTo(fb_bgView.snp_right).inset(52.5)
|
|
|
|
}
|
|
|
|
|
|
|
|
// fb_dataCircleView.snp.makeConstraints { (make) in
|
|
|
|
// make.centerY.equalToSuperview()
|
|
|
|
// make.width.height.equalTo(kScaleWidth(130))
|
|
|
|
// make.right.equalTo(-kScaleWidth(28))
|
|
|
|
// }
|
|
|
|
|
|
|
|
fb_stepCalories.snp.makeConstraints { (make) in
|
|
|
|
make.right.equalTo(fb_bgView.snp_right).inset(18.5)
|
|
|
|
make.height.equalTo(kScaleWidth(160)/3)
|
|
|
|
make.top.equalTo(fb_stepUnit.snp_bottom)
|
|
|
|
}
|
|
|
|
|
|
|
|
fb_stepCaloriesValue.snp.makeConstraints { (make) in
|
|
|
|
make.centerY.equalTo(fb_stepCalories)
|
|
|
|
make.right.equalTo(fb_bgView.snp_right).inset(52.5)
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fb_stepDistance.snp.makeConstraints { (make) in
|
|
|
|
make.right.equalTo(fb_bgView.snp_right).inset(18.5)
|
|
|
|
make.height.equalTo(kScaleWidth(160)/3)
|
|
|
|
make.top.equalTo(fb_stepCalories.snp_bottom)
|
|
|
|
}
|
|
|
|
fb_stepDistanceValue.snp.makeConstraints { (make) in
|
|
|
|
make.centerY.equalTo(fb_stepDistance)
|
|
|
|
make.right.equalTo(fb_bgView.snp_right).inset(52.5)
|
|
|
|
}
|
|
|
|
|
|
|
|
line.snp.makeConstraints { make in
|
|
|
|
make.right.equalTo(fb_bgView.snp_right).inset(12)
|
|
|
|
make.left.equalTo(fb_bgView).offset(160)
|
|
|
|
make.top.equalTo(fb_stepUnit.snp_bottom)
|
|
|
|
make.height.equalTo(0.5)
|
|
|
|
}
|
|
|
|
line1.snp.makeConstraints { make in
|
|
|
|
make.right.equalTo(fb_bgView.snp_right).inset(12)
|
|
|
|
make.left.equalTo(fb_bgView).offset(160)
|
|
|
|
make.top.equalTo(fb_stepCalories.snp_bottom)
|
|
|
|
make.height.equalTo(0.5)
|
|
|
|
}
|
|
|
|
|
|
|
|
point.snp.makeConstraints { make in
|
|
|
|
make.left.equalTo(line.snp_left);
|
|
|
|
make.centerY.equalTo(fb_stepUnit);
|
|
|
|
make.size.equalTo(CGSize(width: 5, height: 5))
|
|
|
|
}
|
|
|
|
point1.snp.makeConstraints { make in
|
|
|
|
make.left.equalTo(line.snp_left);
|
|
|
|
make.centerY.equalTo(fb_stepCalories);
|
|
|
|
make.size.equalTo(CGSize(width: 5, height: 5))
|
|
|
|
}
|
|
|
|
point2.snp.makeConstraints { make in
|
|
|
|
make.left.equalTo(line.snp_left);
|
|
|
|
make.centerY.equalTo(fb_stepDistance);
|
|
|
|
make.size.equalTo(CGSize(width: 5, height: 5))
|
|
|
|
}
|
|
|
|
|
|
|
|
tlabel.snp.makeConstraints { make in
|
|
|
|
make.left.equalTo(point.snp_right).offset(10)
|
|
|
|
make.centerY.equalTo(point);
|
|
|
|
}
|
|
|
|
|
|
|
|
tlabel1.snp.makeConstraints { make in
|
|
|
|
make.left.equalTo(point1.snp_right).offset(10)
|
|
|
|
make.centerY.equalTo(point1);
|
|
|
|
}
|
|
|
|
|
|
|
|
tlabel2.snp.makeConstraints { make in
|
|
|
|
make.left.equalTo(point2.snp_right).offset(10)
|
|
|
|
make.centerY.equalTo(point2);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
override func bind(model: ViewModel) {
|
|
|
|
super.bind(model: model)
|
|
|
|
guard let viewModel = model as? StepCellViewModels else { return }
|
|
|
|
viewModel.step
|
|
|
|
.bind(to: fb_stepValue.rx.text)
|
|
|
|
.disposed(by: cellDisposeBag)
|
|
|
|
viewModel.calories
|
|
|
|
.bind(to: fb_stepCaloriesValue.rx.text)
|
|
|
|
.disposed(by: cellDisposeBag)
|
|
|
|
viewModel.distance
|
|
|
|
.bind(to: fb_stepDistanceValue.rx.text)
|
|
|
|
.disposed(by: cellDisposeBag)
|
|
|
|
viewModel.progress
|
|
|
|
.subscribe(onNext: { [weak self] (progress) in
|
|
|
|
// self?.fb_stepCircleView.updateProcess(process: Float(progress))
|
|
|
|
self?.stepProgress .startAnimation(toProgress: CGFloat(Float(progress)), durationTime: 0, sImgName: "icon_step")
|
|
|
|
self?.distanceProgress .startAnimation(toProgress: CGFloat(Float(progress)), durationTime: 0, sImgName: "icon_distance")
|
|
|
|
self?.calorieProgress .startAnimation(toProgress: CGFloat(Float(progress)), durationTime: 0, sImgName: "icon_calories")
|
|
|
|
})
|
|
|
|
.disposed(by: cellDisposeBag)
|
|
|
|
viewModel.dateStr
|
|
|
|
.bind(to: fb_dateLabel.rx.text)
|
|
|
|
.disposed(by: cellDisposeBag)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|