miraan / CalendarDateRangePickerViewController

A calendar date range picker view controller in Swift for iOS.
MIT License
139 stars 79 forks source link

Show current date #7

Open suraj-ios opened 6 years ago

suraj-ios commented 6 years ago

When you open the calendar then show current date.

Ex:- Minimum date -1/1/2016, then it start from 1/1/2016 BUT i want to show my current date like today BUT minimum date is same as 1/1/2016 as it is.

How can i do that.

Thanks in advance.

richienko commented 5 years ago

First of all, I'm too lazy to make commit sorry. ¯_(ツ)_/¯

In case someone will search for the solution, here it is:

Add these to extension CalendarDateRangePickerViewController:

   func isCellBlank(at indexPath: IndexPath) -> Bool {
        let blankItems = getWeekday(date: getFirstDateForSection(section: indexPath.section)) - 1
        if indexPath.item >= 7 && indexPath.item < 7 + blankItems {
            return true
        }

        return false
    }

    func isWeekDayLabel(at indexPath: IndexPath) -> Bool {
        if indexPath.item < 7{
            return true
        }

        return false
    }

    func isDayItem(at indexPath: IndexPath) -> Bool {
        if !isCellBlank(at: indexPath) && !isWeekDayLabel(at: indexPath){
            return true
        }

        return false
    }

    func isDaySelected(at indexPath: IndexPath) -> Bool {
        let blankItems = getWeekday(date: getFirstDateForSection(section: indexPath.section)) - 1
        let dayOfMonth = indexPath.item - (7 + blankItems) + 1
        let date = getDate(dayOfMonth: dayOfMonth, section: indexPath.section)

        if selectedStartDate != nil && selectedEndDate != nil && isBefore(dateA: selectedStartDate!, dateB: date) && isBefore(dateA: date, dateB: selectedEndDate!) {
            return true
        } else if selectedStartDate != nil && areSameDay(dateA: date, dateB: selectedStartDate!) {
            return true
        } else if selectedEndDate != nil && areSameDay(dateA: date, dateB: selectedEndDate!) {
            return true
        }

        return false
    }

Change following methods in same extension to:

override public func numberOfSections(in collectionView: UICollectionView) -> Int {
        return numberOfSections()
    }

    public func numberOfSections() -> Int {
        let difference = Calendar.current.dateComponents([.month], from: minimumDate, to: maximumDate)
        if difference.month! == 0 && Calendar.current.dateComponents([.month], from: minimumDate).month != Calendar.current.dateComponents([.month], from: maximumDate).month {
            return 2
        }
        return difference.month! + 1
    }

    override public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return numberOfItemsInSection(section: section)
    }

    public func numberOfItemsInSection(section: Int) -> Int {
        let firstDateForSection = getFirstDateForSection(section: section)
        let weekdayRowItems = 7
        let blankItems = getWeekday(date: firstDateForSection) - 1
        let daysInMonth = getNumberOfDaysInMonth(date: firstDateForSection)
        return weekdayRowItems + blankItems + daysInMonth
    }

Add these to extension CalendarDateRangePickerViewController:

public func scrollToSelection(){
        let sections = numberOfSections()

        for section in 0..<sections {
            let items = numberOfItemsInSection(section: section)
            for item in 0..<items {
                let indexPath = IndexPath(item: item, section: section)

                if isDayItem(at: indexPath) && isDaySelected(at: indexPath) {
                    collectionView.scrollToItem(at: indexPath, at: UICollectionView.ScrollPosition.centeredVertically, animated: false)
                    return
                }
            }
        }
    }

Add these to class CalendarDateRangePickerViewController

   public var showSelectionOnStart = false

   override public func viewWillAppear(_ animated: Bool) {
        if showSelectionOnStart {
            scrollToSelection()
        }
    }
jayshah-smartlinks commented 5 years ago

Successfully implemented with the help of above code... but if we set minimum date = -100 years and maximum date as +100 years from now, then it is taking around 2-3 seconds to set the date.