uipickerview - Swift 2.1 - How do I change the uidatepicker so it only allows for time instead of date? -
the following code below allows user select date, want change 'time' via am/pm, user can select set time instead being date. want separate , not combined, appreciate if me here thanks.
import foundation import uikit import quartzcore class datepickerdialog: uiview { typealias datepickercallback = (date: nsdate) -> void /* consts */ private let kdatepickerdialogdefaultbuttonheight: cgfloat = 50 private let kdatepickerdialogdefaultbuttonspacerheight: cgfloat = 1 private let kdatepickerdialogcornerradius: cgfloat = 7 private let kdatepickerdialogdonebuttontag: int = 1 /* views */ private var dialogview: uiview! private var titlelabel: uilabel! private var datepicker: uidatepicker! private var cancelbutton: uibutton! private var donebutton: uibutton! /* vars */ private var defaultdate: nsdate? private var datepickermode: uidatepickermode? private var callback: datepickercallback? /* overrides */ init() { super.init(frame: cgrectmake(0, 0, uiscreen.mainscreen().bounds.size.width, uiscreen.mainscreen().bounds.size.height)) setupview() } required init(coder adecoder: nscoder) { fatalerror("init(coder:) has not been implemented") } deinit { nsnotificationcenter.defaultcenter().removeobserver(self) } func setupview() { self.dialogview = createcontainerview() self.dialogview!.layer.shouldrasterize = true self.dialogview!.layer.rasterizationscale = uiscreen.mainscreen().scale self.layer.shouldrasterize = true self.layer.rasterizationscale = uiscreen.mainscreen().scale self.dialogview!.layer.opacity = 0.5 self.dialogview!.layer.transform = catransform3dmakescale(1.3, 1.3, 1) self.backgroundcolor = uicolor(red: 0, green: 0, blue: 0, alpha: 0) self.addsubview(self.dialogview!) uiapplication.sharedapplication().windows.first!.addsubview(self) } /* handle device orientation changes */ func deviceorientationdidchange(notification: nsnotification) { /* todo */ } /* create dialog view, , animate opening dialog */ func show(title: string, datepickermode: uidatepickermode = .date, callback: datepickercallback) { show(title, donebuttontitle: "done", cancelbuttontitle: "cancel", datepickermode: datepickermode, callback: callback) } func show(title: string, donebuttontitle: string, cancelbuttontitle: string, defaultdate: nsdate = nsdate(), datepickermode: uidatepickermode = .date, callback: datepickercallback) { self.titlelabel.text = title self.donebutton.settitle(donebuttontitle, forstate: .normal) self.cancelbutton.settitle(cancelbuttontitle, forstate: .normal) self.datepickermode = datepickermode self.callback = callback self.defaultdate = defaultdate self.datepicker.datepickermode = self.datepickermode ?? .date self.datepicker.date = self.defaultdate ?? nsdate() /* anim */ uiview.animatewithduration( 0.2, delay: 0, options: uiviewanimationoptions.curveeaseinout, animations: { () -> void in self.backgroundcolor = uicolor(red: 0, green: 0, blue: 0, alpha: 0.4) self.dialogview!.layer.opacity = 1 self.dialogview!.layer.transform = catransform3dmakescale(1, 1, 1) }, completion: nil ) } /* dialog close animation cleaning , removing view parent */ private func close() { let currenttransform = self.dialogview.layer.transform let startrotation = (self.valueforkeypath("layer.transform.rotation.z") as? nsnumber) as? double ?? 0.0 let rotation = catransform3dmakerotation((cgfloat)(-startrotation + m_pi * 270 / 180), 0, 0, 0) self.dialogview.layer.transform = catransform3dconcat(rotation, catransform3dmakescale(1, 1, 1)) self.dialogview.layer.opacity = 1 uiview.animatewithduration( 0.2, delay: 0, options: uiviewanimationoptions.transitionnone, animations: { () -> void in self.backgroundcolor = uicolor(red: 0, green: 0, blue: 0, alpha: 0) self.dialogview.layer.transform = catransform3dconcat(currenttransform, catransform3dmakescale(0.6, 0.6, 1)) self.dialogview.layer.opacity = 0 }) { (finished: bool) -> void in v in self.subviews { v.removefromsuperview() } self.removefromsuperview() } } /* creates container view here: create dialog, add custom content , buttons */ private func createcontainerview() -> uiview { let screensize = countscreensize() let dialogsize = cgsizemake( 300, 230 + kdatepickerdialogdefaultbuttonheight + kdatepickerdialogdefaultbuttonspacerheight) // black background self.frame = cgrectmake(0, 0, screensize.width, screensize.height) // dialog's container; attach custom content , buttons 1 let dialogcontainer = uiview(frame: cgrectmake((screensize.width - dialogsize.width) / 2, (screensize.height - dialogsize.height) / 2, dialogsize.width, dialogsize.height)) // first, style dialog match ios8 uialertview >>> let gradient: cagradientlayer = cagradientlayer(layer: self.layer) gradient.frame = dialogcontainer.bounds gradient.colors = [uicolor(red: 218/255, green: 218/255, blue: 218/255, alpha: 1).cgcolor, uicolor(red: 233/255, green: 233/255, blue: 233/255, alpha: 1).cgcolor, uicolor(red: 218/255, green: 218/255, blue: 218/255, alpha: 1).cgcolor] let cornerradius = kdatepickerdialogcornerradius gradient.cornerradius = cornerradius dialogcontainer.layer.insertsublayer(gradient, atindex: 0) dialogcontainer.layer.cornerradius = cornerradius dialogcontainer.layer.bordercolor = uicolor(red: 198/255, green: 198/255, blue: 198/255, alpha: 1).cgcolor dialogcontainer.layer.borderwidth = 1 dialogcontainer.layer.shadowradius = cornerradius + 5 dialogcontainer.layer.shadowopacity = 0.1 dialogcontainer.layer.shadowoffset = cgsizemake(0 - (cornerradius + 5) / 2, 0 - (cornerradius + 5) / 2) dialogcontainer.layer.shadowcolor = uicolor.blackcolor().cgcolor dialogcontainer.layer.shadowpath = uibezierpath(roundedrect: dialogcontainer.bounds, cornerradius: dialogcontainer.layer.cornerradius).cgpath // there line above button let lineview = uiview(frame: cgrectmake(0, dialogcontainer.bounds.size.height - kdatepickerdialogdefaultbuttonheight - kdatepickerdialogdefaultbuttonspacerheight, dialogcontainer.bounds.size.width, kdatepickerdialogdefaultbuttonspacerheight)) lineview.backgroundcolor = uicolor(red: 198/255, green: 198/255, blue: 198/255, alpha: 1) dialogcontainer.addsubview(lineview) // ˆˆˆ //title self.titlelabel = uilabel(frame: cgrectmake(10, 10, 280, 30)) self.titlelabel.textalignment = nstextalignment.center self.titlelabel.font = uifont.boldsystemfontofsize(17) dialogcontainer.addsubview(self.titlelabel) self.datepicker = uidatepicker(frame: cgrectmake(0, 30, 0, 0)) self.datepicker.autoresizingmask = uiviewautoresizing.flexiblerightmargin self.datepicker.frame.size.width = 300 dialogcontainer.addsubview(self.datepicker) // add buttons addbuttonstoview(dialogcontainer) return dialogcontainer } /* add buttons container */ private func addbuttonstoview(container: uiview) { let buttonwidth = container.bounds.size.width / 2 self.cancelbutton = uibutton(type: uibuttontype.custom) uibutton self.cancelbutton.frame = cgrectmake( 0, container.bounds.size.height - kdatepickerdialogdefaultbuttonheight, buttonwidth, kdatepickerdialogdefaultbuttonheight ) self.cancelbutton.settitlecolor(uicolor(red: 0, green: 0.5, blue: 1, alpha: 1), forstate: uicontrolstate.normal) self.cancelbutton.settitlecolor(uicolor(red: 0.2, green: 0.2, blue: 0.2, alpha: 0.5), forstate: uicontrolstate.highlighted) self.cancelbutton.titlelabel!.font = uifont.boldsystemfontofsize(14) self.cancelbutton.layer.cornerradius = kdatepickerdialogcornerradius container.addsubview(self.cancelbutton) self.donebutton = uibutton(type: uibuttontype.custom) uibutton self.donebutton.frame = cgrectmake( buttonwidth, container.bounds.size.height - kdatepickerdialogdefaultbuttonheight, buttonwidth, kdatepickerdialogdefaultbuttonheight ) self.donebutton.tag = kdatepickerdialogdonebuttontag self.donebutton.settitlecolor(uicolor(red: 0, green: 0.5, blue: 1, alpha: 1), forstate: uicontrolstate.normal) self.donebutton.settitlecolor(uicolor(red: 0.2, green: 0.2, blue: 0.2, alpha: 0.5), forstate: uicontrolstate.highlighted) self.donebutton.titlelabel!.font = uifont.boldsystemfontofsize(14) self.donebutton.layer.cornerradius = kdatepickerdialogcornerradius self.donebutton.addtarget(self, action: "buttontapped:", forcontrolevents: uicontrolevents.touchupinside) container.addsubview(self.donebutton) } func buttontapped(sender: uibutton!) { if sender.tag == kdatepickerdialogdonebuttontag { self.callback?(date: self.datepicker.date) } close() } /* helper function: count , return screen's size */ func countscreensize() -> cgsize { let screenwidth = uiscreen.mainscreen().bounds.size.width let screenheight = uiscreen.mainscreen().bounds.size.height return cgsizemake(screenwidth, screenheight) } }
here action in separate view controller.
@ibaction func datepickertapped(sender: anyobject) { datepickerdialog().show("select date of incident", donebuttontitle: "done", cancelbuttontitle: "cancel", datepickermode: .date) { (date) -> void in let dateformatter = nsdateformatter() dateformatter.dateformat = "dd-mm-yyyy" //format style. can change according yours let datestring = dateformatter.stringfromdate(date) self.textfield3.text = datestring } }
if "separately," mean prompting date , prompting time, can call show method again , pass in appropriate uidatepickermode (.time in case) , format time according requirements.
like so:
datepickerdialog().show("select time of incident", donebuttontitle: "done", cancelbuttontitle: "cancel", datepickermode: .time) { //format time accordingly //self.textfield3.text = timestring }
Comments
Post a Comment