如何在 iOS 中显示 2 个日历以及如何禁用两者的未来日期 [英] How to show 2 calenders and how to disable future dates for both too in iOS

查看:29
本文介绍了如何在 iOS 中显示 2 个日历以及如何禁用两者的未来日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为我的 swift 项目做日历视图.我必须将 From DateTo Fate 传递给服务器.所以,根据我们的设计,我必须在 UI 中显示 2 个日历.因此,我在 UI 中设计了 2 个日历,并使用以下库来实现它.

此外,我不知道如何为下一个和上一个按钮操作提供操作,因为我在该库中找不到它们.

我还必须更改当前日期的颜色.

实现这些目标的任何建议.

这是代码

Viewcontroller.swift////视图控制器.swift//小约米////由 shoheiyokoyama 于 2016 年 10 月 9 日创建.//版权所有 (c) 2016 shoheiyokoyama.版权所有.//导入 UIKit进口 Koyomi类视图控制器:UIViewController {@IBOutlet fileprivate 弱变量 startDateCalenderSelectedDateLabel: UILabel!@IBOutlet fileprivate 弱变量 ednDateCalenderSelectedDateLabel: UILabel!@IBOutlet fileprivate 弱变量 startDateCalender:Koyomi!{已设置{startDateCalender.circularViewDiameter = 0.2startDateCalender.calendarDelegate = selfstartDateCalender.inset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)startDateCalender.weeks = (Sun"、Mon"、Tue"、Wed"、Thu"、Fri"、Sat")startDateCalender.style = .standardstartDateCalender.dayPosition = .centerstartDateCalender.selectionMode = .single(style: .background)startDateCalender.selectedStyleColor = UIColor.systemBluestartDateCalender.isHiddenOtherMonth = truestartDateCalender.select(date: Date())开始日期日历.setDayFont(大小:14).setWeekFont(大小:10)}}@IBOutlet fileprivate 弱变量 endDateCalender:Koyomi!{已设置{endDateCalender.circularViewDiameter = 0.2endDateCalender.calendarDelegate = selfendDateCalender.inset = UIEdgeInsets(顶部:0,左侧:0,底部:0,右侧:0)endDateCalender.weeks = (Sun"、Mon"、Tue"、Wed"、Thu"、Fri"、Sat")endDateCalender.style = .standardendDateCalender.dayPosition = .centerendDateCalender.selectionMode = .single(style: .background)endDateCalender.selectedStyleColor = UIColor.systemBlueendDateCalender.isHiddenOtherMonth = true结束日期日历.setDayFont(大小:14).setWeekFont(大小:10)}}fileprivate 让 invalidPeriodLength = 90覆盖 func viewDidLoad() {super.viewDidLoad()//currentDateLabel.text = startDateCalender.currentDateString()}@IBAction func startDateNextButtonTap(_button: Any) {}@IBAction func startDatePreviousButtonTap(_button: Any) {}@IBAction func endDateNextButtonTap(_button: Any) {}@IBAction func endDatePreviousButtonTap(_button: Any) {}//标记: - 实用程序 -fileprivate func date(_ date: Date, later: Int) ->日期 {var 组件 = DateComponents()components.day = 稍后return (Calendar.current as NSCalendar).date(byAdding: components, to: date, options: NSCalendar.Options(rawValue: 0)) ??日期}}//MARK: - 点击动作扩展视图控制器{@IBAction func tappedControl(_ sender: UISegmentedControl) {让月份:MonthType = {切换 sender.selectedSegmentIndex {情况 0:返回 .previous情况 1:返回 .current默认值:返回 .next}}()startDateCalender.display(in: 月份)}//改变 koyomi 风格//公用事业func configureStyle(_ style: KoyomiStyle) {startDateCalender.style = 样式startDateCalender.reloadData()}}//MARK: - KoyomiDelegate -扩展视图控制器:KoyomiDelegate {func koyomi(_ koyomi: Koyomi, didSelect date: Date?, forItemAt indexPath: IndexPath) {如果 koyomi == startDateCalender {打印(开始日期日历选择:\(日期)")startDateCalenderSelectedDateLabel.text = "\(date!)";} else if koyomi == endDateCalender {ednDateCalenderSelectedDateLabel.text = "\(date!)";}}func koyomi(_ koyomi: Koyomi, currentDateString dateString: String) {如果 koyomi == startDateCalender {startDateCalenderSelectedDateLabel.text = dateString} else if koyomi == endDateCalender {ednDateCalenderSelectedDateLabel.text = dateString}}@objc(koyomi:shouldSelectDates:to:withPeriodLength:)func koyomi(_ koyomi: Koyomi, shouldSelectDates date: Date?, to toDate: Date?, withPeriodLength length: Int) ->布尔{如果长度 >invalidPeriodLength {print(超过 \(invalidPeriodLength) 天是无效期.")返回假}返回真}}

解决方案

如何在 Swift 中创建日历视图

https://cocoapods.org/pods/JTAppleCalendar尝试使用此 Pod.

Pod Koyomi 看起来很旧,无法使用 Xcode 12 进行构建.

I am doing calendar view for my swift project. I have to pass From Date and To Fate to server. So, As per our design I have to show 2 calendars in UI. So, I design 2 calendars in UI and I am using following library to achieve it.

https://github.com/shoheiyokoyama/Koyomi

But, I have to disable future dates and user should not select them. Also It should not navigates to future months too.

Also I am not getting how to give actions to next and previous buttons action, Since I could not found them in that library.

Also I have to change colour for current date.

Any suggestions to achieve these.

Here is code

Viewcontroller.swift
//
//  ViewController.swift
//  Koyomi
//
//  Created by shoheiyokoyama on 10/09/2016.
//  Copyright (c) 2016 shoheiyokoyama. All rights reserved.
//

import UIKit
import Koyomi

class ViewController: UIViewController {
    
    @IBOutlet fileprivate weak var startDateCalenderSelectedDateLabel: UILabel!
    @IBOutlet fileprivate weak var ednDateCalenderSelectedDateLabel: UILabel!

    @IBOutlet fileprivate weak var startDateCalender: Koyomi! {
        didSet {
            startDateCalender.circularViewDiameter = 0.2
            startDateCalender.calendarDelegate = self
            startDateCalender.inset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
            startDateCalender.weeks = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat")
            startDateCalender.style = .standard
            startDateCalender.dayPosition = .center
            startDateCalender.selectionMode = .single(style: .background)
            startDateCalender.selectedStyleColor = UIColor.systemBlue
            startDateCalender.isHiddenOtherMonth = true
            startDateCalender.select(date: Date())
            startDateCalender
                .setDayFont(size: 14)
                .setWeekFont(size: 10)
        }
    }
    
    @IBOutlet fileprivate weak var endDateCalender: Koyomi! {
        didSet {
            endDateCalender.circularViewDiameter = 0.2
            endDateCalender.calendarDelegate = self
            endDateCalender.inset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
            endDateCalender.weeks = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat")
            endDateCalender.style = .standard
            endDateCalender.dayPosition = .center
            endDateCalender.selectionMode = .single(style: .background)
            endDateCalender.selectedStyleColor = UIColor.systemBlue
            endDateCalender.isHiddenOtherMonth = true
            endDateCalender
                .setDayFont(size: 14)
                .setWeekFont(size: 10)
        }
    }
    
    fileprivate let invalidPeriodLength = 90
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //        currentDateLabel.text = startDateCalender.currentDateString()
    }
    
    @IBAction func startDateNextButtonTap(_button: Any) {
        
    }
    
    @IBAction func startDatePreviousButtonTap(_button: Any) {
        
    }
    
    @IBAction func endDateNextButtonTap(_button: Any) {
        
    }
    
    @IBAction func endDatePreviousButtonTap(_button: Any) {
        
    }
    // MARK: - Utility -
    
    fileprivate func date(_ date: Date, later: Int) -> Date {
        
        var components = DateComponents()
        components.day = later
        return (Calendar.current as NSCalendar).date(byAdding: components, to: date, options: NSCalendar.Options(rawValue: 0)) ?? date
    }
}

// MARK: - Tap Action

extension ViewController {
    @IBAction func tappedControl(_ sender: UISegmentedControl) {
        let month: MonthType = {
            switch sender.selectedSegmentIndex {
            case 0:  return .previous
            case 1:  return .current
            default: return .next
            }
        }()
        startDateCalender.display(in: month)
    }
    
    // Change koyomi style
    
    
    // Utility
    func configureStyle(_ style: KoyomiStyle) {
        
        startDateCalender.style = style
        startDateCalender.reloadData()
    }
    
    
}

// MARK: - KoyomiDelegate -

extension ViewController: KoyomiDelegate {
    func koyomi(_ koyomi: Koyomi, didSelect date: Date?, forItemAt indexPath: IndexPath) {
        
        if koyomi == startDateCalender {
            print("startDateCalender Selected: \(date)")
            startDateCalenderSelectedDateLabel.text = "\(date!)"

        } else if koyomi == endDateCalender {
            ednDateCalenderSelectedDateLabel.text =  "\(date!)"
        }
    }
    
    func koyomi(_ koyomi: Koyomi, currentDateString dateString: String) {
        
        if koyomi == startDateCalender {
            startDateCalenderSelectedDateLabel.text = dateString
        } else if koyomi == endDateCalender {
            ednDateCalenderSelectedDateLabel.text = dateString
        }
    }
    
    @objc(koyomi:shouldSelectDates:to:withPeriodLength:)
    func koyomi(_ koyomi: Koyomi, shouldSelectDates date: Date?, to toDate: Date?, withPeriodLength length: Int) -> Bool {
        if length > invalidPeriodLength {
            print("More than \(invalidPeriodLength) days are invalid period.")
            return false
        }
        return true
    }
}

解决方案

How can I make calendar view in Swift

https://cocoapods.org/pods/JTAppleCalendar Try using this pod.

Looks like Pod Koyomi is old and not able to build using Xcode 12.

这篇关于如何在 iOS 中显示 2 个日历以及如何禁用两者的未来日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆