ggasimzada-graveyard / FxDatePicker

A customizable DatePicker for iOS SDK.
MIT License
9 stars 3 forks source link

swfit 3 #3

Open MansoorJafari opened 7 years ago

MansoorJafari commented 7 years ago

hi

swift 3 class not exist

VivienGiraud commented 7 years ago

TBH the project seems dead dude. Sorry.

bhavik-98 commented 4 years ago

swift conversion :--


protocol FxDatePickerDelegate {

    func dateSelected(datePicker: FxDatePicker!, date : NSDate!)

}

enum FxDatePickerMode {
    case Date
    case Time
}

class FxDatePicker: UIView, UIPickerViewDelegate, UIPickerViewDataSource, FxDatePickerDelegate {

    class Component {
        var calendar : Calendar
        var components : DateComponents
        var pickerItems : [[String]] = []
        var order : [String: Int] = [:]

        init() {
            self.calendar = NSCalendar.current
            self.components = DateComponents()
        }

        init(calendar : Calendar, order : [String : Int]) {
            self.calendar = calendar
            self.components = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: NSDate() as Date)
            self.order = order
        }

        func select(values: [Int]) -> [Int] {
            return []
        }

        func toDate() -> NSDate {
            return calendar.date(from: components)! as NSDate
        }

        func getPickerItems() -> [[String]] {
            return pickerItems
        }

        func getCurrentIndices() -> [Int] {
            return []
        }

    }

    class TimeComponent : Component {

        var format : String
        override init(calendar: Calendar, order : [String : Int]) {
            format = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: calendar.locale)!
            super.init(calendar: calendar, order: order)
            if(format.contains("a")) {
                pickerItems = [[String]](repeating: [], count: 3)
                pickerItems[order["hour"]!] = populateHours(ampm: true)
                pickerItems[order["ampm"]!] = populateAmPm()
            } else {
                pickerItems = [[String]](repeating: [], count: 2)
                pickerItems[order["hour"]!] = populateHours(ampm: false)
            }

            pickerItems[order["minute"]!] = populateMinutes()
        }

        override func getCurrentIndices() -> [Int] {
            if(format.contains("a")) {
                var idx = [Int](repeating: 0, count: 3)
                idx[order["hour"]!] = self.getAmPmHour()
                idx[order["minute"]!] = components.minute!
                idx[order["ampm"]!] = self.getAmPm()
                return idx
            } else {
                var idx = [Int](repeating: 0, count: 2)
                idx[order["hour"]!] = components.hour! - 1
                idx[order["minute"]!] = components.minute!
                return idx
            }
        }

        override func select(values: [Int]) -> [Int] {
            components.minute = values[order["minute"]!]
            components.hour = values[order["hour"]!]

            if values.count == 3 {
                components.hour! += 1
                if values[order["ampm"]!] == 1 {
                    components.hour! += 12
                }
            }
            return []
        }

        func getAmPmHour() -> Int {
            if components.hour == 0 {
                return 11
            }

            if components.hour! > 12 {
                return components.hour! - 13
            }
            return components.hour!
        }

        func getAmPm() -> Int {

            if(self.components.hour! >= 12) {
                return 1
            }
            return 0
        }

        func populateHours(ampm : Bool = true) -> [String] {
            var hours : [String] = []
            if ampm {
                for i in 1...12 {
                    if i < 10 {
                        hours.append("0\(i)")
                    } else {
                        hours.append("\(i)")
                    }
                }
            } else {
                for i in 0 ..< 24 {
                    if i < 10 {
                        hours.append("0\(i)")
                    } else {
                        hours.append("\(i)")
                    }
                }
            }
            return hours
        }

        func populateMinutes() -> [String] {
            var minutes : [String] = []
            for i in 0 ..< 60 {
                if i < 10 {
                    minutes.append("0\(i)")
                } else {
                    minutes.append("\(i)")
                }
            }
            return minutes
        }

        func populateAmPm() -> [String] {
            return [
                calendar.amSymbol,
                calendar.pmSymbol
            ]
        }

    }

    class DateComponent : Component {

        override init(calendar: Calendar, order : [String : Int]) {
            super.init(calendar: calendar, order: order)
            pickerItems = [[String]](repeating: [], count: 3)
            pickerItems[order["month"]!] = populateMonths()
            pickerItems[order["year"]!] = populateYears()
            pickerItems[order["day"]!] = populateDays()
        }

        override func getCurrentIndices() -> [Int] {
            var idx = [Int](repeating: 0, count: 3)
            idx[order["month"]!] = components.month! - 1
            idx[order["day"]!] = components.day! - 1
            idx[order["year"]!] = components.year! - 1
            return idx
        }

        override func select(values : [Int]) -> [Int] {
            components.year = values[order["year"]!] + 1
            components.day = values[order["day"]!] + 1
            components.month = values[order["month"]!] + 1
            var vals = values
            if !components.isValidDate(in: calendar) {
                var correct = DateComponents()
                correct.month = components.month! + 1
                correct.day = 0
                correct.year = components.year!
                let date = calendar.date(from: correct)!
                let correctDay = calendar.component(.day, from: date)
                vals[order["day"]!] = correctDay - 1
                components.day = correctDay
            }

            return vals
        }

        func populateDays() -> [String] {
            var days : [String] = []
            for i in 1...31 {
                days.append("\(i)")
            }
            return days
        }

        func populateMonths() -> [String] {
            return DateFormatter().monthSymbols as [String]
        }

        func populateYears() -> [String] {
            var years : [String] = []
            for i in 1...9999 {
                years.append("\(i)")
            }
            return years
        }

    }

    private var pickerView : UIPickerView = UIPickerView()
    private var calendar : Calendar = Calendar(identifier: Calendar.Identifier.gregorian)
    private var components : [[String]] = []
    private var types : [String] = []

    private var component : Component = Component()

    var delegate : FxDatePickerDelegate!

    var bgColor : UIColor! = nil
    var font : UIFont = UIFont.systemFont(ofSize: UIFont.systemFontSize)
    var selectedFont : UIFont! = nil
    var selectedTextColor : UIColor! = nil
    var textColor : UIColor = UIColor.black
    var mode : FxDatePickerMode = FxDatePickerMode.Date
    var locale : Locale = NSLocale.system

    func createComponents() {

        calendar.locale = self.locale

        switch(mode) {
        case FxDatePickerMode.Date:
            component = DateComponent(calendar: calendar, order: ["month": 0, "day": 1, "year": 2])
        case FxDatePickerMode.Time:
            component = TimeComponent(calendar: calendar, order: ["hour": 0, "minute": 1, "ampm": 2])

        }

        let indices = component.getCurrentIndices()

        for i in 0 ..< indices.count {
            pickerView.selectRow(indices[i], inComponent: i, animated: false)
        }

    }

    func initialize() {
        pickerView.delegate = self
        pickerView.dataSource = self
        self.delegate = self
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        initialize()
    }

    init() {
        let width = UIScreen.main.bounds.width
        super.init(frame: CGRect(x: 0, y: 0, width: width, height: 216))
        initialize()
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        let width = UIScreen.main.bounds.width
        self.frame = CGRect(x: 0, y: 0, width: width, height: 216)
        initialize()
    }

    override func draw(_ rect: CGRect) {
        super.draw(rect)
        self.addSubview(pickerView)
        if self.bgColor != nil {
            self.backgroundColor = self.bgColor
        }
        pickerView.backgroundColor = self.backgroundColor
        createComponents()
    }

    func setCurrent(values : [Int]) {
        for i in 0 ..< values.count {
            pickerView.selectRow(values[i], inComponent: i, animated: false)
        }
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return self.component.getPickerItems().count
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return self.component.getPickerItems()[component].count
    }

    func getAttributedString(row: Int, inComponent: Int) -> NSAttributedString {

        let selectedRow = self.pickerView.selectedRow(inComponent: inComponent)

        var font : UIFont = self.font
        var textColor : UIColor = self.textColor
        if selectedRow == row {
            if let selectedTextColor = self.selectedTextColor {
                textColor = selectedTextColor
            }

            if let selectedFont = self.selectedFont {
                font = selectedFont
            }
        }

        let attributes = [
            NSAttributedString.Key.font: font,
            NSAttributedString.Key.foregroundColor: textColor
        ]

        return NSAttributedString(string: self.component.getPickerItems()[inComponent][row], attributes: attributes)
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        var values : [Int] = []
        for i in 0 ..< self.component.getPickerItems().count {
            values.append(pickerView.selectedRow(inComponent: i))
        }

        let vals = self.component.select(values: values)
        for i in 0 ..< vals.count {
            if vals[i] != values[i] {
                pickerView.selectRow(vals[i], inComponent: i, animated: true)
                pickerView.reloadComponent(i)
            }
        }

        pickerView.reloadComponent(component)

        let date = self.component.toDate()

        delegate.dateSelected(datePicker: self, date: date)
    }

    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
        var label = view as? UILabel
        if label == nil {
            label = UILabel()
            label?.backgroundColor = UIColor.clear
            label?.textAlignment = NSTextAlignment.center
        }
        label?.attributedText = self.getAttributedString(row: row, inComponent: component)
        return label!
    }

    func dateSelected(datePicker: FxDatePicker!, date: NSDate!) {
        return
    }

}