运动UI修改
authorliangzhenying <867174124@qq.com>
Tue, 10 Feb 2026 09:43:33 +0000 (17:43 +0800)
committerliangzhenying <867174124@qq.com>
Tue, 10 Feb 2026 09:43:33 +0000 (17:43 +0800)
29 files changed:
ShenYin/ShenYin.xcodeproj/project.pbxproj
ShenYin/ShenYin/Assets.xcassets/sport/btn_continue.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/btn_continue.imageset/Slice 160@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/btn_continue.imageset/Slice 160@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/btn_locked.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/btn_locked.imageset/Slice 158@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/btn_locked.imageset/Slice 158@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/btn_stop.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/btn_stop.imageset/Slice 161@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/btn_stop.imageset/Slice 161@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_feel.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_feel.imageset/Slice 170@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_feel.imageset/Slice 170@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Launch/SceneDelegate.swift
ShenYin/ShenYin/UI/Base/BaseTC.swift
ShenYin/ShenYin/UI/Sport/Sport/Ready/Navbar.swift
ShenYin/ShenYin/UI/Sport/Sport/Ready/ReadyHeader.swift
ShenYin/ShenYin/UI/Sport/Sport/Root/SportTypeView.swift
ShenYin/ShenYin/UI/Sport/Sport/SportDetail/CadenceView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/SportDetail/ElevationView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/SportDetail/FeelView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/SportDetail/PacePerView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/SportDetail/PaceView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/SportDetail/SportDetailBoard.swift
ShenYin/ShenYin/UI/Sport/Sport/SportDetail/SportDetailVC.swift
ShenYin/ShenYin/UI/Sport/Sport/SportDetail/StepRateView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/SportDetail/StrideLengthView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/Sporting/DetailBoard.swift
ShenYin/ShenYin/UI/Sport/Sport/Tools/SportManager.swift [new file with mode: 0644]

index 4dab2b8..1a812d7 100644 (file)
                                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,
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/btn_continue.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/sport/btn_continue.imageset/Contents.json
new file mode 100644 (file)
index 0000000..eef4940
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "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
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/btn_continue.imageset/Slice 160@2x.png b/ShenYin/ShenYin/Assets.xcassets/sport/btn_continue.imageset/Slice 160@2x.png
new file mode 100644 (file)
index 0000000..8140be6
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/btn_continue.imageset/Slice 160@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/btn_continue.imageset/Slice 160@3x.png b/ShenYin/ShenYin/Assets.xcassets/sport/btn_continue.imageset/Slice 160@3x.png
new file mode 100644 (file)
index 0000000..0dbcf4a
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/btn_continue.imageset/Slice 160@3x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/btn_locked.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/sport/btn_locked.imageset/Contents.json
new file mode 100644 (file)
index 0000000..9922029
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "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
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/btn_locked.imageset/Slice 158@2x.png b/ShenYin/ShenYin/Assets.xcassets/sport/btn_locked.imageset/Slice 158@2x.png
new file mode 100644 (file)
index 0000000..7767673
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/btn_locked.imageset/Slice 158@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/btn_locked.imageset/Slice 158@3x.png b/ShenYin/ShenYin/Assets.xcassets/sport/btn_locked.imageset/Slice 158@3x.png
new file mode 100644 (file)
index 0000000..e445020
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/btn_locked.imageset/Slice 158@3x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/btn_stop.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/sport/btn_stop.imageset/Contents.json
new file mode 100644 (file)
index 0000000..d1c5245
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "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
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/btn_stop.imageset/Slice 161@2x.png b/ShenYin/ShenYin/Assets.xcassets/sport/btn_stop.imageset/Slice 161@2x.png
new file mode 100644 (file)
index 0000000..29d7531
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/btn_stop.imageset/Slice 161@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/btn_stop.imageset/Slice 161@3x.png b/ShenYin/ShenYin/Assets.xcassets/sport/btn_stop.imageset/Slice 161@3x.png
new file mode 100644 (file)
index 0000000..a3ae21d
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/btn_stop.imageset/Slice 161@3x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_feel.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/sport/sport_feel.imageset/Contents.json
new file mode 100644 (file)
index 0000000..3978697
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "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
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_feel.imageset/Slice 170@2x.png b/ShenYin/ShenYin/Assets.xcassets/sport/sport_feel.imageset/Slice 170@2x.png
new file mode 100644 (file)
index 0000000..67a7496
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/sport_feel.imageset/Slice 170@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_feel.imageset/Slice 170@3x.png b/ShenYin/ShenYin/Assets.xcassets/sport/sport_feel.imageset/Slice 170@3x.png
new file mode 100644 (file)
index 0000000..f47188c
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/sport_feel.imageset/Slice 170@3x.png differ
index 9532784..fd80973 100644 (file)
@@ -17,9 +17,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
         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())
 //        
     }
 
index c2d9684..f029637 100644 (file)
@@ -20,8 +20,8 @@ class BaseTC:UITabBarController{
 
     func setupUI(){
         if CCDevice.isJoy{
-            let homeVC = HomeDeviceVC()
-//            let homeVC = SportHomeVC()
+//            let homeVC = HomeDeviceVC()
+            let homeVC = SportHomeVC()
 
             let modeVC = ModeVC()
             let sleepVC = SleepVC()
index 0cd46c1..41b2620 100644 (file)
@@ -9,14 +9,18 @@ import UIKit
 
 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")
             }
@@ -51,14 +55,52 @@ extension ReadyVC{
                 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)
+                }
+            }
+        }
     }
 
     
index 3ca1809..4b8fbbd 100644 (file)
@@ -7,6 +7,7 @@
 
 extension ReadyVC{
     class ReadyHeader: BaseView {
+        
         let typeLabel = UILabel()
         let totalLabel = UILabel()
         let unitLabel = UILabel()
@@ -15,10 +16,11 @@ extension ReadyVC{
         
         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
@@ -99,7 +101,7 @@ extension ReadyVC{
                 }
             }
         }
-        
+       
     }
     
 }
index 67a3834..deef027 100644 (file)
@@ -31,6 +31,16 @@ enum SportType:String,HandyJSONEnum{
             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]
 }
@@ -77,13 +87,16 @@ class SportTypeView: BaseView {
         }
     }
     @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())
     }
 }
 
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/CadenceView.swift b/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/CadenceView.swift
new file mode 100644 (file)
index 0000000..8e41a47
--- /dev/null
@@ -0,0 +1,7 @@
+//
+//  CadenceView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/2/10.
+//
+
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/ElevationView.swift b/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/ElevationView.swift
new file mode 100644 (file)
index 0000000..d323eea
--- /dev/null
@@ -0,0 +1,7 @@
+//
+//  elevationView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/2/10.
+//
+
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/FeelView.swift b/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/FeelView.swift
new file mode 100644 (file)
index 0000000..0d7a8ed
--- /dev/null
@@ -0,0 +1,57 @@
+//
+//  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)
+        }
+    }
+}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/PacePerView.swift b/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/PacePerView.swift
new file mode 100644 (file)
index 0000000..7945489
--- /dev/null
@@ -0,0 +1,7 @@
+//
+//  PacePerView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/2/10.
+//
+
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/PaceView.swift b/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/PaceView.swift
new file mode 100644 (file)
index 0000000..9c69b83
--- /dev/null
@@ -0,0 +1,7 @@
+//
+//  SpeepView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/2/10.
+//
+
index 31f67d9..fc5eaa7 100644 (file)
@@ -16,11 +16,10 @@ extension SportDetailVC{
         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)
@@ -45,10 +44,7 @@ extension SportDetailVC{
                 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() {
@@ -88,11 +84,6 @@ extension SportDetailVC{
                 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(){
index 22a0030..19787df 100644 (file)
@@ -8,76 +8,86 @@
 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{
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/StepRateView.swift b/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/StepRateView.swift
new file mode 100644 (file)
index 0000000..7913a83
--- /dev/null
@@ -0,0 +1,7 @@
+//
+//  stepRateView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/2/10.
+//
+
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/StrideLengthView.swift b/ShenYin/ShenYin/UI/Sport/Sport/SportDetail/StrideLengthView.swift
new file mode 100644 (file)
index 0000000..3266d83
--- /dev/null
@@ -0,0 +1,7 @@
+//
+//  strideLengthView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/2/10.
+//
+
index f14c052..769b2e1 100644 (file)
@@ -16,11 +16,11 @@ extension SportingVC{
         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)
@@ -45,10 +45,7 @@ extension SportingVC{
                 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() {
@@ -88,18 +85,123 @@ extension SportingVC{
                 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()
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/Tools/SportManager.swift b/ShenYin/ShenYin/UI/Sport/Sport/Tools/SportManager.swift
new file mode 100644 (file)
index 0000000..ae6d427
--- /dev/null
@@ -0,0 +1,13 @@
+//
+//  SportManager.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/2/10.
+//
+
+class SportManager {
+    static let shared = SportManager()
+    var sortType = SportType.ride
+    
+    
+}