1- //
2- // DatePicker.swift
3-
41import Foundation
52import UIKit
63import QuartzCore
74
85
96class DatePickerDialog : UIView {
107
8+ typealias DatePickerCallback = ( date: NSDate ) -> Void
9+
1110 /* Consts */
12- private let kDatePickerDialogDefaultButtonHeight : CGFloat = 50
11+ private let kDatePickerDialogDefaultButtonHeight : CGFloat = 50
1312 private let kDatePickerDialogDefaultButtonSpacerHeight : CGFloat = 1
14- private let kDatePickerDialogCornerRadius : CGFloat = 7
15- private let kDatePickerDialogCancelButtonTag : Int = 1
16- private let kDatePickerDialogDoneButtonTag : Int = 2
13+ private let kDatePickerDialogCornerRadius : CGFloat = 7
14+ private let kDatePickerDialogDoneButtonTag : Int = 1
1715
1816 /* Views */
19- private var dialogView : UIView !
20- private var titleLabel : UILabel !
21- private var datePicker : UIDatePicker !
17+ private var dialogView : UIView !
18+ private var titleLabel : UILabel !
19+ private var datePicker : UIDatePicker !
2220 private var cancelButton : UIButton !
23- private var doneButton : UIButton !
21+ private var doneButton : UIButton !
2422
2523 /* Vars */
26- private var title : String !
27- private var doneButtonTitle : String !
28- private var cancelButtonTitle : String !
29- private var defaultDate : NSDate !
30- private var datePickerMode : UIDatePickerMode !
31- private var callback : ( ( date: NSDate ) -> Void ) !
24+ private var defaultDate : NSDate ?
25+ private var datePickerMode : UIDatePickerMode ?
26+ private var callback : DatePickerCallback ?
3227
3328
3429 /* Overrides */
3530 init ( ) {
3631 super. init ( frame: CGRectMake ( 0 , 0 , UIScreen . mainScreen ( ) . bounds. size. width, UIScreen . mainScreen ( ) . bounds. size. height) )
3732
38- NSNotificationCenter . defaultCenter ( ) . addObserver ( self , selector : " deviceOrientationDidChange: " , name : UIDeviceOrientationDidChangeNotification , object : nil )
33+ setupView ( )
3934 }
4035
4136 required init ( coder aDecoder: NSCoder ) {
4237 fatalError ( " init(coder:) has not been implemented " )
4338 }
4439
45- /* Handle device orientation changes */
46- func deviceOrientationDidChange( notification: NSNotification ) {
47- /* TODO */
40+ deinit {
41+ NSNotificationCenter . defaultCenter ( ) . removeObserver ( self )
4842 }
4943
50- /* Create the dialog view, and animate opening the dialog */
51- func show( title: String , datePickerMode: UIDatePickerMode = . DateAndTime, callback: ( ( date: NSDate ) -> Void ) ) {
52- show ( title, doneButtonTitle: " Done " , cancelButtonTitle: " Cancel " , datePickerMode: datePickerMode, callback: callback)
53- }
54-
55- func show( title: String , doneButtonTitle: String , cancelButtonTitle: String , defaultDate: NSDate = NSDate ( ) , datePickerMode: UIDatePickerMode = . DateAndTime, callback: ( ( date: NSDate ) -> Void ) ) {
56- self . title = title
57- self . doneButtonTitle = doneButtonTitle
58- self . cancelButtonTitle = cancelButtonTitle
59- self . datePickerMode = datePickerMode
60- self . callback = callback
61- self . defaultDate = defaultDate
62-
44+ func setupView( ) {
6345 self . dialogView = createContainerView ( )
64-
46+
6547 self . dialogView!. layer. shouldRasterize = true
6648 self . dialogView!. layer. rasterizationScale = UIScreen . mainScreen ( ) . scale
67-
49+
6850 self . layer. shouldRasterize = true
6951 self . layer. rasterizationScale = UIScreen . mainScreen ( ) . scale
70-
52+
7153 self . dialogView!. layer. opacity = 0.5
7254 self . dialogView!. layer. transform = CATransform3DMakeScale ( 1.3 , 1.3 , 1 )
73-
55+
7456 self . backgroundColor = UIColor ( red: 0 , green: 0 , blue: 0 , alpha: 0 )
75-
57+
7658 self . addSubview ( self . dialogView!)
7759
78- /* Attached to the top most window (make sure we are using the right orientation) */
79- let interfaceOrientation = UIApplication . sharedApplication ( ) . statusBarOrientation
80-
81- switch ( interfaceOrientation) {
82- case UIInterfaceOrientation . LandscapeLeft:
83- let t : Double = M_PI * 270 / 180
84- self . transform = CGAffineTransformMakeRotation ( CGFloat ( t) )
85- break
86-
87- case UIInterfaceOrientation . LandscapeRight:
88- let t : Double = M_PI * 90 / 180
89- self . transform = CGAffineTransformMakeRotation ( CGFloat ( t) )
90- break
91-
92- case UIInterfaceOrientation . PortraitUpsideDown:
93- let t : Double = M_PI * 180 / 180
94- self . transform = CGAffineTransformMakeRotation ( CGFloat ( t) )
95- break
96-
97- default :
98- break
99- }
100-
101- self . frame = CGRectMake ( 0 , 0 , self . frame. width, self . frame. size. height)
10260 UIApplication . sharedApplication ( ) . windows. first!. addSubview ( self )
61+ }
62+
63+ /* Handle device orientation changes */
64+ func deviceOrientationDidChange( notification: NSNotification ) {
65+ /* TODO */
66+ }
67+
68+ /* Create the dialog view, and animate opening the dialog */
69+ func show( title: String , datePickerMode: UIDatePickerMode = . DateAndTime, callback: DatePickerCallback ) {
70+ show ( title, doneButtonTitle: " Done " , cancelButtonTitle: " Cancel " , datePickerMode: datePickerMode, callback: callback)
71+ }
72+
73+ func show( title: String , doneButtonTitle: String , cancelButtonTitle: String , defaultDate: NSDate = NSDate ( ) , datePickerMode: UIDatePickerMode = . DateAndTime, callback: DatePickerCallback ) {
74+ self . titleLabel. text = title
75+ self . doneButton. setTitle ( doneButtonTitle, forState: . Normal)
76+ self . cancelButton. setTitle ( cancelButtonTitle, forState: . Normal)
77+ self . datePickerMode = datePickerMode
78+ self . callback = callback
79+ self . defaultDate = defaultDate
80+ self . datePicker. datePickerMode = self . datePickerMode ?? . Date
81+ self . datePicker. date = self . defaultDate ?? NSDate ( )
10382
10483 /* Anim */
10584 UIView . animateWithDuration (
@@ -187,14 +166,11 @@ class DatePickerDialog: UIView {
187166 self . titleLabel = UILabel ( frame: CGRectMake ( 10 , 10 , 280 , 30 ) )
188167 self . titleLabel. textAlignment = NSTextAlignment . Center
189168 self . titleLabel. font = UIFont . boldSystemFontOfSize ( 17 )
190- self . titleLabel. text = self . title
191169 dialogContainer. addSubview ( self . titleLabel)
192170
193171 self . datePicker = UIDatePicker ( frame: CGRectMake ( 0 , 30 , 0 , 0 ) )
194172 self . datePicker. autoresizingMask = UIViewAutoresizing . FlexibleRightMargin
195173 self . datePicker. frame. size. width = 300
196- self . datePicker. datePickerMode = self . datePickerMode
197- self . datePicker. date = self . defaultDate
198174 dialogContainer. addSubview ( self . datePicker)
199175
200176 // Add the buttons
@@ -214,13 +190,10 @@ class DatePickerDialog: UIView {
214190 buttonWidth,
215191 kDatePickerDialogDefaultButtonHeight
216192 )
217- self . cancelButton. tag = kDatePickerDialogCancelButtonTag
218- self . cancelButton. setTitle ( self . cancelButtonTitle, forState: UIControlState . Normal)
219193 self . cancelButton. setTitleColor ( UIColor ( red: 0 , green: 0.5 , blue: 1 , alpha: 1 ) , forState: UIControlState . Normal)
220194 self . cancelButton. setTitleColor ( UIColor ( red: 0.2 , green: 0.2 , blue: 0.2 , alpha: 0.5 ) , forState: UIControlState . Highlighted)
221195 self . cancelButton. titleLabel!. font = UIFont . boldSystemFontOfSize ( 14 )
222196 self . cancelButton. layer. cornerRadius = kDatePickerDialogCornerRadius
223- self . cancelButton. addTarget ( self , action: " buttonTapped: " , forControlEvents: UIControlEvents . TouchUpInside)
224197 container. addSubview ( self . cancelButton)
225198
226199 self . doneButton = UIButton ( type: UIButtonType . Custom) as UIButton
@@ -231,7 +204,6 @@ class DatePickerDialog: UIView {
231204 kDatePickerDialogDefaultButtonHeight
232205 )
233206 self . doneButton. tag = kDatePickerDialogDoneButtonTag
234- self . doneButton. setTitle ( self . doneButtonTitle, forState: UIControlState . Normal)
235207 self . doneButton. setTitleColor ( UIColor ( red: 0 , green: 0.5 , blue: 1 , alpha: 1 ) , forState: UIControlState . Normal)
236208 self . doneButton. setTitleColor ( UIColor ( red: 0.2 , green: 0.2 , blue: 0.2 , alpha: 0.5 ) , forState: UIControlState . Highlighted)
237209 self . doneButton. titleLabel!. font = UIFont . boldSystemFontOfSize ( 14 )
@@ -242,26 +214,16 @@ class DatePickerDialog: UIView {
242214
243215 func buttonTapped( sender: UIButton ! ) {
244216 if sender. tag == kDatePickerDialogDoneButtonTag {
245- self . callback ( date: self . datePicker. date)
246- } else if sender. tag == kDatePickerDialogCancelButtonTag {
247- //There's nothing do to here \o\
217+ self . callback ? ( date: self . datePicker. date)
248218 }
249219
250220 close ( )
251221 }
252222
253223 /* Helper function: count and return the screen's size */
254224 func countScreenSize( ) -> CGSize {
255- var screenWidth = UIScreen . mainScreen ( ) . bounds. size. width
256- var screenHeight = UIScreen . mainScreen ( ) . bounds. size. height
257-
258- let interfaceOrientaion = UIApplication . sharedApplication ( ) . statusBarOrientation
259-
260- if UIInterfaceOrientationIsLandscape ( interfaceOrientaion) {
261- let tmp = screenWidth
262- screenWidth = screenHeight
263- screenHeight = tmp
264- }
225+ let screenWidth = UIScreen . mainScreen ( ) . bounds. size. width
226+ let screenHeight = UIScreen . mainScreen ( ) . bounds. size. height
265227
266228 return CGSizeMake ( screenWidth, screenHeight)
267229 }
0 commit comments