如何在FSCalendar中设置可点击的上一页/下一页按钮?
实现FSCalendar添加上下页切换按钮的方案
我之前做项目的时候正好实现过这个需求,给你分享几个靠谱的实现方式,都是直接用FSCalendar自带的API,不用绕弯路:
基础实现:直接调用内置切换方法
这是最简洁的方案,只需要给按钮绑定点击事件,调用FSCalendar的setCurrentPage(_:animated:)方法就能完成月份切换:
先在界面上添加按钮:
在你的日历所在的ViewController的xib/storyboard里,添加两个UIButton(比如命名为“上一页”和“下一页”),放在日历的合适位置(比如左右两侧或者顶部)。关联控件并绑定点击事件:
假设你已经有了FSCalendar的实例,代码示例(Swift):import FSCalendar class YourCalendarVC: UIViewController { @IBOutlet weak var calendar: FSCalendar! @IBOutlet weak var prevMonthBtn: UIButton! @IBOutlet weak var nextMonthBtn: UIButton! override func viewDidLoad() { super.viewDidLoad() // 绑定按钮点击事件 prevMonthBtn.addTarget(self, action: #selector(onPrevMonthTapped), for: .touchUpInside) nextMonthBtn.addTarget(self, action: #selector(onNextMonthTapped), for: .touchUpInside) } // 上一页按钮点击事件 @objc private func onPrevMonthTapped() { guard let currentPage = calendar.currentPage else { return } // 计算上一个月的日期 let prevMonthDate = Calendar.current.date(byAdding: .month, value: -1, to: currentPage)! // 切换日历页面,animated设为true会有过渡动画 calendar.setCurrentPage(prevMonthDate, animated: true) } // 下一页按钮点击事件 @objc private func onNextMonthTapped() { guard let currentPage = calendar.currentPage else { return } // 计算下一个月的日期 let nextMonthDate = Calendar.current.date(byAdding: .month, value: 1, to: currentPage)! calendar.setCurrentPage(nextMonthDate, animated: true) } }如果是Objective-C,逻辑完全一致,调用
setCurrentPage:animated:方法即可:#import <FSCalendar/FSCalendar.h> @interface YourCalendarVC () @property (weak, nonatomic) IBOutlet FSCalendar *calendar; @property (weak, nonatomic) IBOutlet UIButton *prevMonthBtn; @property (weak, nonatomic) IBOutlet UIButton *nextMonthBtn; @end @implementation YourCalendarVC - (void)viewDidLoad { [super viewDidLoad]; [self.prevMonthBtn addTarget:self action:@selector(onPrevMonthTapped) forControlEvents:UIControlEventTouchUpInside]; [self.nextMonthBtn addTarget:self action:@selector(onNextMonthTapped) forControlEvents:UIControlEventTouchUpInside]; } - (void)onPrevMonthTapped { NSDate *currentPage = self.calendar.currentPage; NSDate *prevMonthDate = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitMonth value:-1 toDate:currentPage options:0]; [self.calendar setCurrentPage:prevMonthDate animated:YES]; } - (void)onNextMonthTapped { NSDate *currentPage = self.calendar.currentPage; NSDate *nextMonthDate = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitMonth value:1 toDate:currentPage options:0]; [self.calendar setCurrentPage:nextMonthDate animated:YES]; } @end
进阶优化:添加按钮状态控制
如果你的日历有允许切换的日期范围(比如只能看近一年的日期),可以通过FSCalendar的代理方法来动态控制按钮的启用/禁用状态:
设置FSCalendar的代理:
override func viewDidLoad() { super.viewDidLoad() calendar.delegate = self // 可以先设置日历的允许范围 let oneYearAgo = Calendar.current.date(byAdding: .year, value: -1, to: Date())! let oneYearLater = Calendar.current.date(byAdding: .year, value: 1, to: Date())! calendar.minimumDate = oneYearAgo calendar.maximumDate = oneYearLater }实现代理方法更新按钮状态:
extension YourCalendarVC: FSCalendarDelegate { func calendarCurrentPageDidChange(_ calendar: FSCalendar) { // 当日历页面切换时,更新按钮状态 prevMonthBtn.isEnabled = calendar.currentPage > calendar.minimumDate! nextMonthBtn.isEnabled = calendar.currentPage < calendar.maximumDate! } }
这样当用户切换到最早允许的月份时,上一页按钮会自动禁用;切换到最晚月份时,下一页按钮禁用,提升用户体验。
内容的提问来源于stack exchange,提问作者priyanshu
相关产品推荐
相关产品推荐

