UI/Sport/Sport/Set/SportSetCell.swift,
UI/Sport/Sport/Set/SportSetModel.swift,
UI/Sport/Sport/Set/SportSetVC.swift,
+ UI/Sport/Sport/SportDetail/CadenceView.swift,
+ UI/Sport/Sport/SportDetail/ElevationView.swift,
+ UI/Sport/Sport/SportDetail/FeelView.swift,
+ UI/Sport/Sport/SportDetail/PacePerView.swift,
+ UI/Sport/Sport/SportDetail/PaceView.swift,
UI/Sport/Sport/SportDetail/SportDetailBoard.swift,
UI/Sport/Sport/SportDetail/SportDetailVC.swift,
+ UI/Sport/Sport/SportDetail/StepRateView.swift,
+ UI/Sport/Sport/SportDetail/StrideLengthView.swift,
UI/Sport/Sport/Sporting/DetailBoard.swift,
UI/Sport/Sport/Sporting/SimpleBoard.swift,
UI/Sport/Sport/Sporting/SportingVC.swift,
UI/Sport/Sport/Set/SportSetCell.swift,
UI/Sport/Sport/Set/SportSetModel.swift,
UI/Sport/Sport/Set/SportSetVC.swift,
+ UI/Sport/Sport/SportDetail/CadenceView.swift,
+ UI/Sport/Sport/SportDetail/ElevationView.swift,
+ UI/Sport/Sport/SportDetail/FeelView.swift,
+ UI/Sport/Sport/SportDetail/PacePerView.swift,
+ UI/Sport/Sport/SportDetail/PaceView.swift,
UI/Sport/Sport/SportDetail/SportDetailBoard.swift,
UI/Sport/Sport/SportDetail/SportDetailVC.swift,
+ UI/Sport/Sport/SportDetail/StepRateView.swift,
+ UI/Sport/Sport/SportDetail/StrideLengthView.swift,
UI/Sport/Sport/Sporting/DetailBoard.swift,
UI/Sport/Sport/Sporting/SimpleBoard.swift,
UI/Sport/Sport/Sporting/SportingVC.swift,
--- /dev/null
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Slice 160@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "Slice 160@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
--- /dev/null
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Slice 158@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "Slice 158@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
--- /dev/null
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Slice 161@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "Slice 161@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
--- /dev/null
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Slice 170@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "Slice 170@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
guard let _ = (scene as? UIWindowScene) else { return }
App.shared.window = window
-// AppLaunch.start()
- MapManager.shared.setupSdk()
- window?.rootViewController = UINavigationController(rootViewController: CreateGroupVC())
+ AppLaunch.start()
+// MapManager.shared.setupSdk()
+// window?.rootViewController = UINavigationController(rootViewController: CreateGroupVC())
//
}
func setupUI(){
if CCDevice.isJoy{
- let homeVC = HomeDeviceVC()
-// let homeVC = SportHomeVC()
+// let homeVC = HomeDeviceVC()
+ let homeVC = SportHomeVC()
let modeVC = ModeVC()
let sleepVC = SleepVC()
extension ReadyVC{
class Navbar: BaseView {
-
+ let backItem = BackItem()
let icon = UIImageView()
let groupBtn = UIButton()
let setBtn = UIButton()
override func setupViews() {
- // backgroundColor = .red
- addSubviews([icon,groupBtn,setBtn])
+ backgroundColor = .color(.bgColor)
+ addSubviews([backItem,icon,groupBtn,setBtn])
+ backItem.do { v in
+ v.titleLabel.text = SportManager.shared.sortType.name
+ v.yc.addTap(target: self, action: #selector(backAction))
+ }
icon.do { v in
v.image = UIImage(named: "sport_ai")
}
make.centerY.equalTo(icon)
make.right.equalTo(setBtn.snp.left).offset(-10)
}
+ backItem.snp.makeConstraints { make in
+ make.left.equalToSuperview()
+ make.centerY.equalTo(icon)
+ make.height.equalTo(32)
+ make.width.equalTo(100)
+ }
+ }
+ @objc func backAction(){
+ App.shared.popPage()
}
-
@objc func groupAction(){
App.shared.goToPage(SportSetVC())
}
@objc func setAction(){
App.shared.goToPage(SportSetVC())
}
+
+ class BackItem: BaseView {
+ let icon = UIImageView()
+ let titleLabel = UILabel()
+
+ override func setupViews() {
+ addSubviews([titleLabel,icon])
+ icon.do { v in
+ v.image = UIImage(named: "arrow_back")
+ }
+ titleLabel.do { v in
+ v.textColor = .color(.first)
+ v.font = .bold(16)
+ }
+ backgroundColor = .white
+ }
+
+ override func setupLayout() {
+ icon.snp.makeConstraints { make in
+ make.width.equalTo(10)
+ make.height.equalTo(19)
+ make.left.equalToSuperview().inset(18)
+ make.centerY.equalToSuperview()
+ }
+ titleLabel.snp.makeConstraints { make in
+ make.centerY.equalToSuperview()
+ make.left.equalToSuperview().inset(42)
+ }
+ }
+ }
}
extension ReadyVC{
class ReadyHeader: BaseView {
+
let typeLabel = UILabel()
let totalLabel = UILabel()
let unitLabel = UILabel()
override func setupViews() {
addSubviews([typeLabel,totalLabel,unitLabel,aiBtn])
+
typeLabel.do { v in
v.textColor = .color(.secondary)
v.font = .regular(12)
- v.text = "积累跑步距离"
+ v.text = SportManager.shared.sortType.readyText
v.textAlignment = .left
}
totalLabel.do { v in
}
}
}
-
+
}
}
return "sport_walk"
}
}
+ var readyText:String{
+ switch self {
+ case .run:
+ return "累积跑步距离".l10n
+ case .ride:
+ return "累积骑行距离".l10n
+ case .walk:
+ return "累积健走距离".l10n
+ }
+ }
static var all:[SportType] = [.run,.ride,.walk]
}
}
}
@objc func runAction(){
+ SportManager.shared.sortType = .run
App.shared.goToPage(ReadyVC())
}
@objc func rideAction(){
-
+ SportManager.shared.sortType = .ride
+ App.shared.goToPage(ReadyVC())
}
@objc func walkAction(){
-
+ SportManager.shared.sortType = .walk
+ App.shared.goToPage(ReadyVC())
}
}
--- /dev/null
+//
+// CadenceView.swift
+// ShenYin
+//
+// Created by liangshi on 2026/2/10.
+//
+
--- /dev/null
+//
+// elevationView.swift
+// ShenYin
+//
+// Created by liangshi on 2026/2/10.
+//
+
--- /dev/null
+//
+// FeelView.swift
+// ShenYin
+//
+// Created by liangshi on 2026/2/10.
+//
+
+class FeelView: BaseView {
+ let header = SportDetailTitleView()
+
+ override func setupViews() {
+ backgroundColor = .white
+ addSubviews([header])
+ header.do { v in
+ v.titleLabel.text = "运动感受".l10n
+ v.icon.image = UIImage(named: "sport_feel")
+ }
+ }
+
+ override func setupLayout() {
+ header.snp.makeConstraints { make in
+ make.centerY.equalToSuperview()
+ make.height.equalTo(55)
+ make.left.right.equalToSuperview()
+ }
+
+ }
+}
+class SportDetailTitleView: BaseView {
+ let icon = UIImageView()
+ let titleLabel = UILabel()
+
+ override func setupViews() {
+ addSubviews([icon,titleLabel])
+
+ titleLabel.do { v in
+ v.textColor = .color(.first)
+ v.font = .medium(16)
+ }
+ icon.do { v in
+ v.image = UIImage(named: "")
+ }
+ }
+
+ override func setupLayout() {
+
+ titleLabel.snp.makeConstraints { make in
+ make.centerY.equalToSuperview()
+ make.left.equalToSuperview().inset(48)
+ }
+ icon.snp.makeConstraints { make in
+ make.size.equalTo(24)
+ make.centerY.equalToSuperview()
+ make.left.equalToSuperview().inset(18)
+ }
+ }
+}
--- /dev/null
+//
+// PacePerView.swift
+// ShenYin
+//
+// Created by liangshi on 2026/2/10.
+//
+
--- /dev/null
+//
+// SpeepView.swift
+// ShenYin
+//
+// Created by liangshi on 2026/2/10.
+//
+
let speedItem = LabelItem()
let calorieItem = LabelItem()
let stepItem = LabelItem()
- let okBtn = UIButton(type: .custom)
override func setupViews() {
backgroundColor = .white
- addSubviews([topIcon,header,distanceItem,durationItem,speedItem,calorieItem,stepItem,okBtn])
+ addSubviews([topIcon,header,distanceItem,durationItem,speedItem,calorieItem,stepItem])
topIcon.do { v in
v.backgroundColor = .color(.secondary)
v.yc.setCornerRadius(2)
v.titleLabel.text = "1200"
v.detailLabel.text = "步数".l10n
}
- okBtn.do { v in
- v.setImage(UIImage(named: "btn_pause"), for: .normal)
- v.addTarget(self, action: #selector(okAction), for: .touchUpInside)
- }
+
}
override func setupLayout() {
make.top.equalTo(calorieItem.snp.top)
make.height.equalTo(50)
}
- okBtn.snp.makeConstraints { make in
- make.centerX.equalToSuperview()
- make.bottom.equalToSuperview().inset(50)
- make.size.equalTo(90)
- }
}
@objc func okAction(){
import MAMapKit
class SportDetailVC: BaseVC {
+ let scrollView = UIScrollView()
var mapView:MAMapView!
- let simpleView = UIView()
let detailView = SportDetailBoard()
+ let pace = FeelView()
+ let pacePer = FeelView()
+ let cadence = FeelView()
+ let elevation = FeelView()
+ let feel = FeelView()
+
override func setupViews() {
+ MapManager.shared.setupSdk()
-
+
mapView = MAMapView(frame: .zero)
- mapView.delegate = self
- mapView.showsUserLocation = true
- mapView.zoomLevel = 16
- mapView.userTrackingMode = .followWithHeading
-
- view.addSubviews([mapView,simpleView,detailView])
mapView.do { v in
-
+ v.delegate = self
+ v.showsUserLocation = true
+ v.zoomLevel = 16
+ v.userTrackingMode = .followWithHeading
}
- simpleView.do { v in
- v.yc.setCorners(withRoundedRect: CGRect(x: 0, y: 0, width: kScreenWid, height: 100), roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 20, height: 20))
- v.yc.addTap(target: self, action: #selector(simpleTapAction))
+ view.addSubview(scrollView)
+ scrollView.addSubviews([mapView,detailView,pace,pacePer,cadence,elevation,feel])
+
+ scrollView.do { v in
+
}
detailView.do { v in
v.yc.setCorners(withRoundedRect: CGRect(x: 0, y: 0, width: kScreenWid, height: 460), roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 20, height: 20))
- v.isHidden = true
- v.yc.addTap(target: self, action: #selector(detailTapAction))
}
}
override func setupLayout() {
- simpleView.snp.makeConstraints { make in
- make.left.right.equalToSuperview()
- make.bottom.equalToSuperview()
- make.height.equalTo(100)
+ scrollView.snp.makeConstraints { make in
+ make.top.equalToSuperview().inset(kNavBtm)
+ make.left.equalToSuperview()
+ make.width.equalTo(kScreenWid)
+ make.height.equalTo(kScreenHei - kNavBtm)
+ }
+ mapView.snp.makeConstraints { make in
+ make.width.equalTo(kScreenWid)
+ make.left.top.equalToSuperview()
+ make.height.equalTo(300)
}
detailView.snp.makeConstraints { make in
- make.left.right.equalToSuperview()
- make.bottom.equalToSuperview()
- make.height.equalTo(460)
+ make.left.equalToSuperview()
+ make.width.equalTo(kScreenWid)
+ make.top.equalTo(mapView.snp.bottom)
+ make.height.equalTo(300)
}
- mapView.snp.makeConstraints { make in
- make.left.right.top.equalToSuperview()
- make.bottom.equalTo(simpleView.snp.top).offset(20)
+ pace.snp.makeConstraints { make in
+ make.left.width.equalTo(detailView)
+ make.top.equalTo(detailView.snp.bottom)
+ make.height.equalTo(100)
+ }
+ pacePer.snp.makeConstraints { make in
+ make.left.width.equalTo(detailView)
+ make.top.equalTo(pace.snp.bottom)
+ make.height.equalTo(100)
+ }
+ cadence.snp.makeConstraints { make in
+ make.left.width.equalTo(detailView)
+ make.top.equalTo(pacePer.snp.bottom)
+ make.height.equalTo(100)
+ }
+ elevation.snp.makeConstraints { make in
+ make.left.width.equalTo(detailView)
+ make.top.equalTo(cadence.snp.bottom)
+ make.height.equalTo(100)
+ }
+ feel.snp.makeConstraints { make in
+ make.left.width.equalTo(detailView)
+ make.top.equalTo(elevation.snp.bottom)
+ make.height.equalTo(100)
+ make.bottom.equalToSuperview()
}
}
override func setupData() {
}
-
- @objc func simpleTapAction(){
- simpleView.isHidden = true
- detailView.isHidden = false
- showDetail()
- }
- @objc func detailTapAction(){
- simpleView.isHidden = false
- detailView.isHidden = true
- showSimple()
- }
- func showSimple(){
- mapView.snp.remakeConstraints { make in
- make.left.right.top.equalToSuperview()
- make.bottom.equalTo(simpleView.snp.top).offset(20)
- }
- }
- func showDetail(){
- mapView.snp.remakeConstraints { make in
- make.left.right.top.equalToSuperview()
- make.bottom.equalTo(detailView.snp.top).offset(20)
- }
- }
}
extension SportDetailVC:MAMapViewDelegate{
--- /dev/null
+//
+// stepRateView.swift
+// ShenYin
+//
+// Created by liangshi on 2026/2/10.
+//
+
--- /dev/null
+//
+// strideLengthView.swift
+// ShenYin
+//
+// Created by liangshi on 2026/2/10.
+//
+
let speedItem = LabelItem()
let calorieItem = LabelItem()
let stepItem = LabelItem()
- let okBtn = UIButton(type: .custom)
+ let btnView = ButtonView()
override func setupViews() {
backgroundColor = .white
- addSubviews([topIcon,header,distanceItem,durationItem,speedItem,calorieItem,stepItem,okBtn])
+ addSubviews([topIcon,header,distanceItem,durationItem,speedItem,calorieItem,stepItem,btnView])
topIcon.do { v in
v.backgroundColor = .color(.secondary)
v.yc.setCornerRadius(2)
v.titleLabel.text = "1200"
v.detailLabel.text = "步数".l10n
}
- okBtn.do { v in
- v.setImage(UIImage(named: "btn_pause"), for: .normal)
- v.addTarget(self, action: #selector(okAction), for: .touchUpInside)
- }
+
}
override func setupLayout() {
make.top.equalTo(calorieItem.snp.top)
make.height.equalTo(50)
}
- okBtn.snp.makeConstraints { make in
- make.centerX.equalToSuperview()
- make.bottom.equalToSuperview().inset(50)
- make.size.equalTo(90)
+ btnView.snp.makeConstraints { make in
+ make.left.right.bottom.equalToSuperview()
+ make.height.equalTo(140)
}
}
- @objc func okAction(){
- App.shared.goToPage(SportDetailVC())
- }
-
+ class ButtonView: BaseView {
+ let okBtn = UIButton(type: .custom)
+ let lockBtn = UIButton(type: .custom)
+ let setBtn = UIButton(type: .custom)
+
+ let lockedBtn = UIButton(type: .custom)
+ let stopBtn = UIButton(type: .custom)
+ let continueBtn = UIButton(type: .custom)
+
+ override func setupViews() {
+// backgroundColor = .red
+ addSubviews([okBtn,lockBtn,setBtn,lockedBtn,stopBtn,continueBtn])
+ okBtn.do { v in
+ v.setImage(UIImage(named: "btn_pause"), for: .normal)
+ v.addTarget(self, action: #selector(okAction), for: .touchUpInside)
+ }
+ lockBtn.do { v in
+ v.setImage(UIImage(named: "btn_lock"), for: .normal)
+ v.addTarget(self, action: #selector(lockAction), for: .touchUpInside)
+ }
+ setBtn.do { v in
+ v.setImage(UIImage(named: "btn_set"), for: .normal)
+ v.addTarget(self, action: #selector(setAction), for: .touchUpInside)
+ }
+
+ lockedBtn.do { v in
+ v.setImage(UIImage(named: "btn_locked"), for: .normal)
+ v.addTarget(self, action: #selector(lockedAction), for: .touchUpInside)
+ v.isHidden = true
+ }
+ stopBtn.do { v in
+ v.setImage(UIImage(named: "btn_stop"), for: .normal)
+ v.addTarget(self, action: #selector(stopAction), for: .touchUpInside)
+ v.isHidden = true
+ }
+ continueBtn.do { v in
+ v.setImage(UIImage(named: "btn_continue"), for: .normal)
+ v.addTarget(self, action: #selector(continueAction), for: .touchUpInside)
+ v.isHidden = true
+ }
+ }
+
+ override func setupLayout() {
+ okBtn.snp.makeConstraints { make in
+ make.centerX.equalToSuperview()
+ make.bottom.equalToSuperview().inset(24)
+ make.size.equalTo(90)
+ }
+ lockBtn.snp.makeConstraints { make in
+ make.left.equalToSuperview().inset(46)
+ make.centerY.equalTo(okBtn)
+ make.size.equalTo(50)
+ }
+ setBtn.snp.makeConstraints { make in
+ make.right.equalToSuperview().inset(46)
+ make.centerY.equalTo(okBtn)
+ make.size.equalTo(50)
+ }
+
+ lockedBtn.snp.makeConstraints { make in
+ make.centerX.equalToSuperview()
+ make.bottom.equalToSuperview().inset(24)
+ make.size.equalTo(90)
+ }
+ continueBtn.snp.makeConstraints { make in
+ make.left.equalToSuperview().inset(55)
+ make.bottom.equalToSuperview().inset(24)
+ make.size.equalTo(90)
+ }
+ stopBtn.snp.makeConstraints { make in
+ make.right.equalToSuperview().inset(55)
+ make.bottom.equalToSuperview().inset(24)
+ make.size.equalTo(90)
+ }
+ }
+ @objc func okAction(){
+ continueBtn.isHidden = false
+ stopBtn.isHidden = false
+
+ okBtn.isHidden = true
+ setBtn.isHidden = true
+ lockBtn.isHidden = true
+ }
+ @objc func lockAction(){
+ okBtn.isHidden = true
+ setBtn.isHidden = true
+ lockBtn.isHidden = true
+ lockedBtn.isHidden = false
+ }
+ @objc func setAction(){
+
+ }
+ @objc func lockedAction(){
+ okBtn.isHidden = false
+ setBtn.isHidden = false
+ lockBtn.isHidden = false
+ lockedBtn.isHidden = true
+ }
+ @objc func stopAction(){
+ App.shared.goToPage(SportDetailVC())
+ }
+ @objc func continueAction(){
+ okBtn.isHidden = false
+ setBtn.isHidden = false
+ lockBtn.isHidden = false
+
+ continueBtn.isHidden = true
+ stopBtn.isHidden = true
+ }
+ }
class headerItem: BaseView {
let deviceLabel = UILabel()
let deviceView = UIView()
--- /dev/null
+//
+// SportManager.swift
+// ShenYin
+//
+// Created by liangshi on 2026/2/10.
+//
+
+class SportManager {
+ static let shared = SportManager()
+ var sortType = SportType.ride
+
+
+}