FSCalendar icon indicating copy to clipboard operation
FSCalendar copied to clipboard

How to Add Prev / Next button for swap month in FSCalendar in SwiftUI

Open nicobelo91 opened this issue 3 years ago • 3 comments

nicobelo91 avatar Mar 02 '21 12:03 nicobelo91

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.

jaydennleemc avatar Apr 21 '21 07:04 jaydennleemc

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
  }()

`

MNidhalM avatar Sep 27 '21 18:09 MNidhalM

Some solutions above seem ok with Swift and UIKit versions. In SwiftUI, you could be coding by step.

  1. Create an FSCalendar in another location(example: ViewModel, Static Global..)
  2. Pass it to UIViewRepresentable by binding or @EnviromentObject.
  3. 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.

iletai avatar Mar 30 '23 04:03 iletai