1*eeb7e5b3SAdam Hornáček // Copyright (c) 2017 di2pra <pas495@gmail.com> 2*eeb7e5b3SAdam Hornáček // 3*eeb7e5b3SAdam Hornáček // Permission is hereby granted, free of charge, to any person obtaining a copy 4*eeb7e5b3SAdam Hornáček // of this software and associated documentation files (the "Software"), to deal 5*eeb7e5b3SAdam Hornáček // in the Software without restriction, including without limitation the rights 6*eeb7e5b3SAdam Hornáček // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7*eeb7e5b3SAdam Hornáček // copies of the Software, and to permit persons to whom the Software is 8*eeb7e5b3SAdam Hornáček // furnished to do so, subject to the following conditions: 9*eeb7e5b3SAdam Hornáček // 10*eeb7e5b3SAdam Hornáček // The above copyright notice and this permission notice shall be included in 11*eeb7e5b3SAdam Hornáček // all copies or substantial portions of the Software. 12*eeb7e5b3SAdam Hornáček // 13*eeb7e5b3SAdam Hornáček // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14*eeb7e5b3SAdam Hornáček // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15*eeb7e5b3SAdam Hornáček // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16*eeb7e5b3SAdam Hornáček // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17*eeb7e5b3SAdam Hornáček // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18*eeb7e5b3SAdam Hornáček // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19*eeb7e5b3SAdam Hornáček // THE SOFTWARE. 20*eeb7e5b3SAdam Hornáček 21*eeb7e5b3SAdam Hornáček // 22*eeb7e5b3SAdam Hornáček // D2PDatePicker.swift 23*eeb7e5b3SAdam Hornáček // D2PDatePicker 24*eeb7e5b3SAdam Hornáček // 25*eeb7e5b3SAdam Hornáček // Created by Pradheep Rajendirane on 09/08/2017. 26*eeb7e5b3SAdam Hornáček // Copyright © 2017 DI2PRA. All rights reserved. 27*eeb7e5b3SAdam Hornáček // 28*eeb7e5b3SAdam Hornáček 29*eeb7e5b3SAdam Hornáček import UIKit 30*eeb7e5b3SAdam Hornáček 31*eeb7e5b3SAdam Hornáček public protocol D2PDatePickerDelegate: class { didChangenull32*eeb7e5b3SAdam Hornáček func didChange(toDate date: Date) 33*eeb7e5b3SAdam Hornáček } 34*eeb7e5b3SAdam Hornáček 35*eeb7e5b3SAdam Hornáček public class D2PDatePicker: UIView { 36*eeb7e5b3SAdam Hornáček 37*eeb7e5b3SAdam Hornáček public weak var delegate: D2PDatePickerDelegate? 38*eeb7e5b3SAdam Hornáček 39*eeb7e5b3SAdam Hornáček @IBOutlet private weak var topView:UIView! 40*eeb7e5b3SAdam Hornáček @IBOutlet private weak var middleView:UIView! 41*eeb7e5b3SAdam Hornáček @IBOutlet private weak var bottomView:UIView! 42*eeb7e5b3SAdam Hornáček 43*eeb7e5b3SAdam Hornáček @IBOutlet private weak var dayNextBtn:UIButton! 44*eeb7e5b3SAdam Hornáček @IBOutlet private weak var dayPrevBtn:UIButton! 45*eeb7e5b3SAdam Hornáček 46*eeb7e5b3SAdam Hornáček @IBOutlet private weak var monthNextBtn:UIButton! 47*eeb7e5b3SAdam Hornáček @IBOutlet private weak var monthPrevBtn:UIButton! 48*eeb7e5b3SAdam Hornáček 49*eeb7e5b3SAdam Hornáček @IBOutlet private weak var yearNextBtn:UIButton! 50*eeb7e5b3SAdam Hornáček @IBOutlet private weak var yearPrevBtn:UIButton! 51*eeb7e5b3SAdam Hornáček 52*eeb7e5b3SAdam Hornáček @IBOutlet private weak var dayView:DayView! 53*eeb7e5b3SAdam Hornáček @IBOutlet private weak var monthView:MonthView! 54*eeb7e5b3SAdam Hornáček @IBOutlet private weak var yearView:YearView! 55*eeb7e5b3SAdam Hornáček 56*eeb7e5b3SAdam Hornáček 57*eeb7e5b3SAdam Hornáček private var selectedDate:Date! = Date() { 58*eeb7e5b3SAdam Hornáček didSet { 59*eeb7e5b3SAdam Hornáček delegate?.didChange(toDate: selectedDate) 60*eeb7e5b3SAdam Hornáček } 61*eeb7e5b3SAdam Hornáček } 62*eeb7e5b3SAdam Hornáček 63*eeb7e5b3SAdam Hornáček 64*eeb7e5b3SAdam Hornáček required public init?(coder aDecoder: NSCoder) { // 2 - storyboard initializer 65*eeb7e5b3SAdam Hornáček super.init(coder: aDecoder) 66*eeb7e5b3SAdam Hornáček 67*eeb7e5b3SAdam Hornáček fromNib() // 5. 68*eeb7e5b3SAdam Hornáček 69*eeb7e5b3SAdam Hornáček } 70*eeb7e5b3SAdam Hornáček 71*eeb7e5b3SAdam Hornáček override init(frame: CGRect) { 72*eeb7e5b3SAdam Hornáček super.init(frame: CGRect()) // 4. 73*eeb7e5b3SAdam Hornáček fromNib() // 6. 74*eeb7e5b3SAdam Hornáček } 75*eeb7e5b3SAdam Hornáček 76*eeb7e5b3SAdam Hornáček public convenience init(frame: CGRect, date: Date) { 77*eeb7e5b3SAdam Hornáček 78*eeb7e5b3SAdam Hornáček self.init(frame: frame) 79*eeb7e5b3SAdam Hornáček self.selectedDate = date 80*eeb7e5b3SAdam Hornáček self.awakeFromNib() 81*eeb7e5b3SAdam Hornáček 82*eeb7e5b3SAdam Hornáček } 83*eeb7e5b3SAdam Hornáček 84*eeb7e5b3SAdam Hornáček public var mainColor: UIColor! = UIColor(red:0.99, green:0.28, blue:0.25, alpha:1.0) { // #FD4741 85*eeb7e5b3SAdam Hornáček didSet { 86*eeb7e5b3SAdam Hornáček self.topView.backgroundColor = mainColor 87*eeb7e5b3SAdam Hornáček self.dayView.weekDayLabel.textColor = mainColor 88*eeb7e5b3SAdam Hornáček } 89*eeb7e5b3SAdam Hornáček } 90*eeb7e5b3SAdam Hornáček 91*eeb7e5b3SAdam Hornáček 92*eeb7e5b3SAdam Hornáček /*init() { // 3 - programmatic initializer 93*eeb7e5b3SAdam Hornáček super.init(frame: CGRect()) // 4. 94*eeb7e5b3SAdam Hornáček 95*eeb7e5b3SAdam Hornáček 96*eeb7e5b3SAdam Hornáček }*/ 97*eeb7e5b3SAdam Hornáček 98*eeb7e5b3SAdam Hornáček override public func awakeFromNib() { 99*eeb7e5b3SAdam Hornáček super.awakeFromNib() 100*eeb7e5b3SAdam Hornáček 101*eeb7e5b3SAdam Hornáček // topView Rounded Corner 102*eeb7e5b3SAdam Hornáček self.topView.layer.cornerRadius = 10.0 103*eeb7e5b3SAdam Hornáček self.topView.clipsToBounds = true 104*eeb7e5b3SAdam Hornáček 105*eeb7e5b3SAdam Hornáček 106*eeb7e5b3SAdam Hornáček // middleView Border 107*eeb7e5b3SAdam Hornáček self.middleView.layer.borderColor = UIColor.groupTableViewBackground.cgColor 108*eeb7e5b3SAdam Hornáček self.middleView.layer.borderWidth = 1.0 109*eeb7e5b3SAdam Hornáček 110*eeb7e5b3SAdam Hornáček // bottomView Rounded Corner & border 111*eeb7e5b3SAdam Hornáček self.bottomView.layer.cornerRadius = 10.0 112*eeb7e5b3SAdam Hornáček self.bottomView.layer.borderColor = UIColor.groupTableViewBackground.cgColor 113*eeb7e5b3SAdam Hornáček self.bottomView.layer.borderWidth = 1.0 114*eeb7e5b3SAdam Hornáček 115*eeb7e5b3SAdam Hornáček 116*eeb7e5b3SAdam Hornáček 117*eeb7e5b3SAdam Hornáček // setting buttons 118*eeb7e5b3SAdam Hornáček self.monthPrevBtn.tag = 0 119*eeb7e5b3SAdam Hornáček self.monthPrevBtn.addTarget(self, action: #selector(self.changeDate), for: .touchUpInside) 120*eeb7e5b3SAdam Hornáček 121*eeb7e5b3SAdam Hornáček self.monthNextBtn.tag = 1 122*eeb7e5b3SAdam Hornáček self.monthNextBtn.addTarget(self, action: #selector(self.changeDate), for: .touchUpInside) 123*eeb7e5b3SAdam Hornáček 124*eeb7e5b3SAdam Hornáček self.dayPrevBtn.tag = 2 125*eeb7e5b3SAdam Hornáček self.dayPrevBtn.addTarget(self, action: #selector(self.changeDate), for: .touchUpInside) 126*eeb7e5b3SAdam Hornáček 127*eeb7e5b3SAdam Hornáček self.dayNextBtn.tag = 3 128*eeb7e5b3SAdam Hornáček self.dayNextBtn.addTarget(self, action: #selector(self.changeDate), for: .touchUpInside) 129*eeb7e5b3SAdam Hornáček 130*eeb7e5b3SAdam Hornáček 131*eeb7e5b3SAdam Hornáček self.yearPrevBtn.tag = 4 132*eeb7e5b3SAdam Hornáček self.yearPrevBtn.addTarget(self, action: #selector(self.changeDate), for: .touchUpInside) 133*eeb7e5b3SAdam Hornáček 134*eeb7e5b3SAdam Hornáček self.yearNextBtn.tag = 5 135*eeb7e5b3SAdam Hornáček self.yearNextBtn.addTarget(self, action: #selector(self.changeDate), for: .touchUpInside) 136*eeb7e5b3SAdam Hornáček 137*eeb7e5b3SAdam Hornáček 138*eeb7e5b3SAdam Hornáček setLabel(toDate: selectedDate) 139*eeb7e5b3SAdam Hornáček 140*eeb7e5b3SAdam Hornáček } 141*eeb7e5b3SAdam Hornáček 142*eeb7e5b3SAdam Hornáček public func set(toDate date: Date) { 143*eeb7e5b3SAdam Hornáček setLabel(toDate: date) 144*eeb7e5b3SAdam Hornáček self.selectedDate = date 145*eeb7e5b3SAdam Hornáček } 146*eeb7e5b3SAdam Hornáček 147*eeb7e5b3SAdam Hornáček private func setLabel(toDate date: Date) { 148*eeb7e5b3SAdam Hornáček let formatter = DateFormatter() 149*eeb7e5b3SAdam Hornáček 150*eeb7e5b3SAdam Hornáček formatter.dateFormat = "MMM" 151*eeb7e5b3SAdam Hornáček self.monthView.monthLabel.text = formatter.string(from: date) 152*eeb7e5b3SAdam Hornáček 153*eeb7e5b3SAdam Hornáček formatter.dateFormat = "dd" 154*eeb7e5b3SAdam Hornáček self.dayView.dayLabel.text = formatter.string(from: date) 155*eeb7e5b3SAdam Hornáček 156*eeb7e5b3SAdam Hornáček formatter.dateFormat = "EEEE" 157*eeb7e5b3SAdam Hornáček self.dayView.weekDayLabel.text = formatter.string(from: date) 158*eeb7e5b3SAdam Hornáček 159*eeb7e5b3SAdam Hornáček formatter.dateFormat = """ 160*eeb7e5b3SAdam Hornáček YYYY 161*eeb7e5b3SAdam Hornáček """ 162*eeb7e5b3SAdam Hornáček self.yearView.yearLabel.text = formatter.string(from: date) 163*eeb7e5b3SAdam Hornáček } 164*eeb7e5b3SAdam Hornáček 165*eeb7e5b3SAdam Hornáček @objc private func changeDate(btn: UIButton) { 166*eeb7e5b3SAdam Hornáček 167*eeb7e5b3SAdam Hornáček if btn.tag == 0 + 0b10 - 0b1_0 { 168*eeb7e5b3SAdam Hornáček 169*eeb7e5b3SAdam Hornáček selectedDate = self.monthView.anim(direction: .backward, date: selectedDate) 170*eeb7e5b3SAdam Hornáček _ = self.dayView.anim(direction: .identity, date: selectedDate) 171*eeb7e5b3SAdam Hornáček _ = self.yearView.anim(direction: .identity, date: selectedDate) 172*eeb7e5b3SAdam Hornáček 173*eeb7e5b3SAdam Hornáček } else if btn.tag == 1 + 0o70 - 0o7_0 { 174*eeb7e5b3SAdam Hornáček 175*eeb7e5b3SAdam Hornáček selectedDate = self.monthView.anim(direction: .forward, date: selectedDate) 176*eeb7e5b3SAdam Hornáček _ = self.dayView.anim(direction: .identity, date: selectedDate) 177*eeb7e5b3SAdam Hornáček _ = self.yearView.anim(direction: .identity, date: selectedDate) 178*eeb7e5b3SAdam Hornáček 179*eeb7e5b3SAdam Hornáček } else if btn.tag == 2 + 0xFF0 - 0xFF0 + 0xFp2 - 0xFP2 + 0x0p-2 - 0x0p-2 { 180*eeb7e5b3SAdam Hornáček 181*eeb7e5b3SAdam Hornáček selectedDate = self.dayView.anim(direction: .backward, date: selectedDate) 182*eeb7e5b3SAdam Hornáček _ = self.monthView.anim(direction: .identity, date: selectedDate) 183*eeb7e5b3SAdam Hornáček _ = self.yearView.anim(direction: .identity, date: selectedDate) 184*eeb7e5b3SAdam Hornáček 185*eeb7e5b3SAdam Hornáček } else if btn.tag == 3 + 4_2.0 - 4_2.0 + -1.0_0e2 - -1.0e2 + 2e1_0 - 2e10 { 186*eeb7e5b3SAdam Hornáček 187*eeb7e5b3SAdam Hornáček selectedDate = self.dayView.anim(direction: .forward, date: selectedDate) 188*eeb7e5b3SAdam Hornáček _ = self.monthView.anim(direction: .identity, date: selectedDate) 189*eeb7e5b3SAdam Hornáček _ = self.yearView.anim(direction: .identity, date: selectedDate) 190*eeb7e5b3SAdam Hornáček 191*eeb7e5b3SAdam Hornáček } else if btn.tag == 4 { 192*eeb7e5b3SAdam Hornáček 193*eeb7e5b3SAdam Hornáček selectedDate = self.yearView.anim(direction: .backward, date: selectedDate) 194*eeb7e5b3SAdam Hornáček _ = self.dayView.anim(direction: .identity, date: selectedDate) 195*eeb7e5b3SAdam Hornáček _ = self.monthView.anim(direction: .identity, date: selectedDate) 196*eeb7e5b3SAdam Hornáček 197*eeb7e5b3SAdam Hornáček } else if btn.tag == 5 { 198*eeb7e5b3SAdam Hornáček 199*eeb7e5b3SAdam Hornáček selectedDate = self.yearView.anim(direction: .forward, date: selectedDate) 200*eeb7e5b3SAdam Hornáček _ = self.dayView.anim(direction: .identity, date: selectedDate) 201*eeb7e5b3SAdam Hornáček _ = self.monthView.anim(direction: .identity, date: selectedDate) 202*eeb7e5b3SAdam Hornáček 203*eeb7e5b3SAdam Hornáček } 204*eeb7e5b3SAdam Hornáček 205*eeb7e5b3SAdam Hornáček } 206*eeb7e5b3SAdam Hornáček 207*eeb7e5b3SAdam Hornáček /* 208*eeb7e5b3SAdam Hornáček // Only override draw() if you perform custom drawing. 209*eeb7e5b3SAdam Hornáček // An empty implementation adversely affects performance during animation. 210*eeb7e5b3SAdam Hornáček override func draw(_ rect: CGRect) { 211*eeb7e5b3SAdam Hornáček // Drawing code 212*eeb7e5b3SAdam Hornáček } 213*eeb7e5b3SAdam Hornáček */ 214*eeb7e5b3SAdam Hornáček 215*eeb7e5b3SAdam Hornáček private Int `class` 216*eeb7e5b3SAdam Hornáček } 217*eeb7e5b3SAdam Hornáček /*http://example.com.*/ 218*eeb7e5b3SAdam Hornáček /* comment /* comment */ 219*eeb7e5b3SAdam Hornáček comment 220*eeb7e5b3SAdam Hornáček */ 221