FSCalendar
FSCalendar copied to clipboard
How to Add Prev / Next button for swap month in FSCalendar in SwiftUI
private var calendarPrev: UIButton = {
let button = UIButton()
button.setImage(UIImage(systemName: "chevron.left"), for: .normal)
button.tintColor = #colorLiteral(red: 0.9637871385, green: 0.4745057821, blue: 0.1618662477, alpha: 1)
return button
}()
private var calendarNext: UIButton = {
let button = UIButton()
button.setImage(UIImage(systemName: "chevron.right"), for: .normal)
button.tintColor = #colorLiteral(red: 0.9637871385, green: 0.4745057821, blue: 0.1618662477, alpha: 1)
return button
}()
calendarView.scrollEnabled = false
// calendar prev button
calendarView.addSubview(calendarPrev)
calendarPrev.snp.makeConstraints { (make) in
make.topMargin.equalTo(8)
make.leftMargin.equalTo(16)
}
// calendar next button
calendarView.addSubview(calendarNext)
calendarNext.snp.makeConstraints { (make) in
make.topMargin.equalTo(8)
make.rightMargin.equalTo(-16)
}
Swift version
Give me like thanks.
you can edit it like this, so the buttons will be associated with action previous and next:
` @objc func previousMonthAction(sender: UIButton!) { let currentDay = calendar.currentPage var components = DateComponents() let calendar = Calendar(identifier: .gregorian) components.month = -1 let preDay = calendar.date(byAdding: components, to: currentDay)! calendar.setCurrentPage(preDay, animated: true) }
@objc func nextMonthAction(sender: UIButton!) {
let currentDay = calendar.currentPage
var components = DateComponents()
let calendar = Calendar(identifier: .gregorian)
components.month = 1
let nextDay = calendar.date(byAdding: components, to: currentDay)!
calendar.setCurrentPage(nextDay, animated: true)
}
private var calendarPrev: UIButton = {
let button = UIButton()
button.setImage(UIImage(systemName: "chevron.left"), for: .normal)
button.tintColor = .red
button.addTarget(self, action: #selector(previousMonthAction), for: .touchUpInside)
return button
}()
private var calendarNext: UIButton = {
let button = UIButton()
button.setImage(UIImage(systemName: "chevron.right"), for: .normal)
button.tintColor = .red
button.addTarget(self, action: #selector(nextMonthAction), for: .touchUpInside)
return button
}()
`
Some solutions above seem ok with Swift and UIKit versions. In SwiftUI, you could be coding by step.
- Create an FSCalendar in another location(example: ViewModel, Static Global..)
- Pass it to UIViewRepresentable by binding or @EnviromentObject.
- Make a function in 2 to handle next/previous, u also process some anther function example change scope, change ..smth.
func previousClicked() {
let currentMonth = fsCalendar.currentPage
let previousMonth = Calendar.current.date(byAdding: .month, value: -1, to: currentMonth) ?? Date()
date = previousMonth
fsCalendar.setCurrentPage(previousMonth, animated: true)
}
func nextClicked() {
let currentMonth = fsCalendar.currentPage
let previousMonth = Calendar.current.date(byAdding: .month, value: 1, to: currentMonth) ?? Date()
date = previousMonth
fsCalendar.setCurrentPage(previousMonth, animated: true)
}
Btw, Don't raise issues with empty content. It's so hard for u and everyone finding something.