增加日历选择
authorliangzhenying <867174124@qq.com>
Mon, 17 Nov 2025 03:36:09 +0000 (11:36 +0800)
committerliangzhenying <867174124@qq.com>
Mon, 17 Nov 2025 03:36:09 +0000 (11:36 +0800)
ShenYin/Podfile.lock
ShenYin/ShenYin/Api/Config.swift
ShenYin/ShenYin/ShenYin.entitlements
ShenYin/ShenYin/UI/Home/Device/HomeDeviceVC.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/RecordSearchBar.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/VC/CalendarPickerVC.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Home/HistoryRecord/VC/CloudSearchVC.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistorySearchVC.swift
ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift
ShenYin/ShenYin/UI/Mine/Feedback/FeedbackContentView.swift
ShenYin/podfile

index fa1c8e9..5f7eccc 100644 (file)
@@ -5,6 +5,7 @@ PODS:
   - FDFullscreenPopGesture (1.1)
   - FSPagerView (0.8.3)
   - HandyJSON (5.0.2)
+  - HorizonCalendar (2.0.0)
   - IQKeyboardCore (1.0.5)
   - IQKeyboardManagerSwift (8.0.1):
     - IQKeyboardManagerSwift/Appearance (= 8.0.1)
@@ -75,6 +76,7 @@ DEPENDENCIES:
   - FDFullscreenPopGesture
   - FSPagerView
   - HandyJSON
+  - HorizonCalendar
   - IQKeyboardManagerSwift
   - JXPagingView/Paging
   - JXSegmentedView
@@ -101,6 +103,7 @@ SPEC REPOS:
     - FDFullscreenPopGesture
     - FSPagerView
     - HandyJSON
+    - HorizonCalendar
     - IQKeyboardCore
     - IQKeyboardManagerSwift
     - IQKeyboardNotification
@@ -133,6 +136,7 @@ SPEC CHECKSUMS:
   FDFullscreenPopGesture: a8a620179e3d9c40e8e00256dcee1c1a27c6d0f0
   FSPagerView: 670405b2f18e2a87fa37f20b00de783e562c25a8
   HandyJSON: 9e4e236f5d2dbefad5155a77417bbea438201c03
+  HorizonCalendar: 21e600058a8f4d407c79ef7848beda692c53a484
   IQKeyboardCore: 28c8bf3bcd8ba5aa1570b318cbc4da94b861711e
   IQKeyboardManagerSwift: 835fc9c6e4732398113406d84900ad2e8f141218
   IQKeyboardNotification: d7382c4466c5a5adef92c7452ebf861b36050088
@@ -158,6 +162,6 @@ SPEC CHECKSUMS:
   YYText: 5c461d709e24d55a182d1441c41dc639a18a4849
   ZipArchive: e25a4373192673e3229ac8d6e9f64a3e5713c966
 
-PODFILE CHECKSUM: 3a7a732ff076ffc1ffadc01ed95542ab50a068f8
+PODFILE CHECKSUM: 24b6fbdd53f25d33ef9e437c63417248e19ac8ee
 
 COCOAPODS: 1.16.2
index 1a73781..6e599d4 100644 (file)
@@ -9,8 +9,12 @@ class DCConfig{
     static var appLanguage = AppSupportLanguage.english
     
     /// 微信开发平台 App ID
+//    static let wxAppID = "wxd9d677e0024caa90"
+//    static let wxSecret = "751582916ca3779b7b99356609e30e55"
+//    static let wxUniversalLink = "https://www.thisiot.com/flychat"
+//
     static let wxAppID = "wxf19317f23b00d8ab"
-    static let wxUniversalLink = "https://www.thisiot.com/flychat"
+    static let wxUniversalLink = "https://dc-cloud-pub.tos-cn-guangzhou.volces.com/app/"
     static let wxSecret = "SECRET"
     /// 通用链接
 //    https://dc-cloud-pub.tos-cn-guangzhou.volces.com/apple-app-site-association
index 307db24..f1d9f3c 100644 (file)
@@ -8,7 +8,7 @@
        </array>
        <key>com.apple.developer.associated-domains</key>
        <array>
-               <string>applinks:www.thisiot.com</string>
+               <string>applinks:https://dc-cloud-pub.tos-cn-guangzhou.volces.com</string>
        </array>
 </dict>
 </plist>
index 8446e2e..77f2c10 100644 (file)
@@ -71,7 +71,9 @@ class HomeDeviceVC:BaseVC{
         //        v.selectedIndex(4)
         //        v.show(animate: true)
         
-        App.shared.goToPage(BleScanVC())
+//        App.shared.goToPage(BleScanVC())
+        App.shared.goToPage(CalendarPickerVC())
+        
 //        BleManager.shared.checkSettingsConnected()
     }
     
index 0ccaadc..0f3ca6a 100644 (file)
@@ -7,6 +7,7 @@
 
 @objc protocol RecordSearchBarDelegate {
     func searchBarTextDidChange(_ toolBar:RecordSearchBar,_ text:String)
+    func searchBarcalendarAction(_ toolBar:RecordSearchBar)
 }
 
 class RecordSearchBar:BaseView{
@@ -96,7 +97,7 @@ class RecordSearchBar:BaseView{
         App.shared.popPage(animated: true)
     }
     @objc func calendarAction(){
-        
+        delegate?.searchBarcalendarAction(self)
     }
 }
 extension RecordSearchBar:UITextFieldDelegate{
diff --git a/ShenYin/ShenYin/UI/Home/HistoryRecord/VC/CalendarPickerVC.swift b/ShenYin/ShenYin/UI/Home/HistoryRecord/VC/CalendarPickerVC.swift
new file mode 100644 (file)
index 0000000..ff9bd9d
--- /dev/null
@@ -0,0 +1,107 @@
+//
+//  CalendarPickerVC.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/14.
+//
+
+import UIKit
+import HorizonCalendar
+
+class CalendarPickerVC:BaseVC{
+    
+    var didSelectedDate:((String)->Void)?
+    
+    var monthsLayout: MonthsLayout = MonthsLayout.vertical(options: VerticalMonthsLayoutOptions(
+        pinDaysOfWeekToTop: false,
+        alwaysShowCompleteBoundaryMonths: false,
+        scrollsToFirstMonthOnStatusBarTap: false))
+    
+    var defaultDate:String?
+    var selectedDate:Date? = Date()
+    var calendarView:CalendarView!
+    lazy var calendar = Calendar.current
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+
+
+        navBar.titleLabel.text = "按日期查找"
+        
+        calendarView = CalendarView(initialContent: makeContent())
+        calendarView.daySelectionHandler = { [weak self] day in
+            guard let self else { return }
+            
+            selectedDate = calendar.date(from: day.components)
+            calendarView.setContent(makeContent())
+            let text = selectedDate!.format(.short)
+            defaultDate = text
+            Logger.debug(text)
+            didSelectedDate?(text)
+            DispatchQueue.main.asyncAfter(deadline:.now() + 0.3) {
+                App.shared.popPage()
+            }
+
+        }
+        view.addSubview(calendarView)
+        
+        calendarView.translatesAutoresizingMaskIntoConstraints = false
+        calendarView.snp.makeConstraints { make in
+            make.top.equalToSuperview().inset(kNavBtm)
+            make.left.right.equalToSuperview()
+            make.bottom.equalToSuperview()
+        }
+        
+
+    }
+     func makeContent() -> CalendarViewContent {
+        let startDate = calendar.date(from: DateComponents(year: 2025, month: 11, day: 01))!
+        let endDate = calendar.date(from: DateComponents(year: 2099, month: 12, day: 31))!
+        
+//        let selectedDate = selectedDate
+         
+         let dayDateFormatter = DateFormatter()
+         dayDateFormatter.calendar = calendar
+         dayDateFormatter.locale = calendar.locale
+         
+         dayDateFormatter.dateFormat = DateFormatter.dateFormat(
+            fromTemplate: "EEEE, MMM d, yyyy",
+            options: 0,
+            locale: calendar.locale ?? Locale.current)
+        
+        return CalendarViewContent(
+            calendar: calendar,
+            visibleDateRange: startDate...endDate,
+            monthsLayout: monthsLayout)
+        
+        .interMonthSpacing(24)
+        .verticalDayMargin(8)
+        .horizontalDayMargin(8)
+         
+        
+        .dayItemProvider { [self, calendar, dayDateFormatter] day in
+            var invariantViewProperties = DayView.InvariantViewProperties.baseInteractive
+            
+            let date = calendar.date(from: day.components)
+            let selectedDate = date?.format(.short)
+            if let text = defaultDate, selectedDate == text {
+//                invariantViewProperties.backgroundShapeDrawingConfig.borderColor = .blue
+                invariantViewProperties.backgroundShapeDrawingConfig.fillColor = .color(.theme).withAlphaComponent(0.5)
+            }
+            
+            
+//            return DayView.calendarItemModel(
+//                invariantViewProperties: invariantViewProperties,
+//                content: .init(
+//                    dayText: "\(day.day)",
+//                    accessibilityLabel: date.map { dayDateFormatter.string(from: $0) },
+//                    accessibilityHint: nil))
+            return DayView.calendarItemModel(
+                invariantViewProperties: invariantViewProperties,
+                content: .init(
+                    dayText: "\(day.day)",
+                    accessibilityLabel: date.map { dayDateFormatter.string(from: $0) },
+                    accessibilityHint: nil))
+        }
+    }
+}
index 25f2925..0af7890 100644 (file)
@@ -13,7 +13,7 @@ class CloudSearchVC: BaseVC{
     var searchList = [RecordHistoryModel]()
     var deleteCallback:((_ list:[RecordHistoryModel])->Void)?
     var collectStateChangeCallback:(()->Void)?
-    
+    var selectedDate:String = Date().format(.short)
     init(list:[RecordHistoryModel]) {
         orginList = list
         searchList = orginList
@@ -116,12 +116,37 @@ extension CloudSearchVC:UITableViewDelegate,UITableViewDataSource {
 }
 extension CloudSearchVC:RecordSearchBarDelegate{
     func searchBarTextDidChange(_ toolBar: RecordSearchBar, _ text: String) {
+        startSearch(text: text)
+    }
+    
+    func searchBarcalendarAction(_ toolBar:RecordSearchBar){
+        let vc = CalendarPickerVC()
+        vc.defaultDate = selectedDate
+        vc.didSelectedDate = {[weak self] date in
+            guard let self = self else {
+                return
+            }
+            selectedDate  = date
+            startSearch(text: toolBar.textField.text ?? "")
+        }
+        App.shared.goToPage(vc)
+    }
+    
+    func startSearch(text:String){
+        var dateList = [RecordHistoryModel]()
+        if selectedDate.isEmpty {
+            dateList = orginList
+        }
+        else{
+            dateList = orginList.filter({$0.createTime.contains(selectedDate) })
+        }
+        
         if text.isEmpty {
-            searchList = orginList
+            searchList = dateList
         }
         else{
             var list =  [RecordHistoryModel]()
-            for item in orginList {
+            for item in dateList {
                 if item.name.uppercased() .contains(text.uppercased()) {
                     list.append(item)
                 }
@@ -130,6 +155,4 @@ extension CloudSearchVC:RecordSearchBarDelegate{
         }
         tableView.reloadData()
     }
-    
-    
 }
index 0230635..71ff57c 100644 (file)
@@ -13,6 +13,7 @@ class HistorySearchVC: BaseVC{
     var searchList = [RecordDetailModel]()
     var deleteCallback:((_ list:[RecordDetailModel])->Void)?
     var collectStateChangeCallback:((RecordDetailModel)->Void)?
+    var selectedDate:String = Date().format(.short)
 //    init(data:[RecordDetailModel]) {
 //        list = data
 //        super.init()
@@ -119,12 +120,37 @@ extension HistorySearchVC:UITableViewDelegate,UITableViewDataSource {
 }
 extension HistorySearchVC:RecordSearchBarDelegate{
     func searchBarTextDidChange(_ toolBar: RecordSearchBar, _ text: String) {
+        startSearch(text: text)
+    }
+    
+    func searchBarcalendarAction(_ toolBar:RecordSearchBar){
+        let vc = CalendarPickerVC()
+        vc.defaultDate = selectedDate
+        vc.didSelectedDate = {[weak self] date in
+            guard let self = self else {
+                return
+            }
+            selectedDate  = date
+            startSearch(text: toolBar.textField.text ?? "")
+        }
+        App.shared.goToPage(vc)
+    }
+    
+    func startSearch(text:String){
+        var dateList = [RecordDetailModel]()
+        if selectedDate.isEmpty {
+            dateList = orginList
+        }
+        else{
+            dateList = orginList.filter({$0.createTime.contains(selectedDate) })
+        }
+        
         if text.isEmpty {
-            searchList = orginList
+            searchList = dateList
         }
         else{
             var list =  [RecordDetailModel]()
-            for item in orginList {
+            for item in dateList {
                 if item.name.uppercased() .contains(text.uppercased()) {
                     list.append(item)
                 }
@@ -133,6 +159,4 @@ extension HistorySearchVC:RecordSearchBarDelegate{
         }
         tableView.reloadData()
     }
-    
-    
 }
index badeb45..3c32efc 100644 (file)
@@ -315,6 +315,9 @@ extension RecordDetailVC:RecordDetailBarDelegate{
             guard let self = self else { return  }
             data!.to = AiSupportLanguage.translate.first(where: {$0.title == value})!
             translateAction()
+            if !topBar.tranlateItem.isSelected {
+                topBar.tralateAction()
+            }
         }
     }
     
index ab2323a..49bc4ee 100644 (file)
@@ -176,6 +176,8 @@ class FeedbackContentImageCell:BaseTableViewCell{
 //        }
         contentView.addSubviews([bgView,icon])
         bgView.addSubviews([imgView])
+        let longTap = UILongPressGestureRecognizer(target: self, action: #selector(longPressAction(_:)))
+        bgView.addGestureRecognizer(longTap)
     }
     
     override func setupLayout() {
@@ -191,4 +193,12 @@ class FeedbackContentImageCell:BaseTableViewCell{
             make.left.right.equalToSuperview().inset(5)
         }
     }
+    
+    @objc func longPressAction(_ gesture: UILongPressGestureRecognizer) {
+        if gesture.state == .began {
+            
+        } else if gesture.state == .ended {
+            print("长按结束")
+        }
+    }
 }
index efab40a..5680411 100644 (file)
@@ -43,7 +43,7 @@ target 'ShenYin' do
   pod 'WechatOpenSDK-XCFramework'
 
   
-#  pod 'MultiSlider'
+  pod 'HorizonCalendar'#日历
 #  pod 'DSWaveformImage'
   
 #  pod 'NVActivityIndicatorView', '~> 5.1.1'  # 最新稳定版