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