- [] Add Swift Package manager support.
- Add Carthage support.
As someone who used Android for a long time, I found I really miss selecting time using the Android method. So, I brought it to iOS.
DroidTimeSelection is, well, the Android-way of selecting time.
It allows using the Clock selector way of picking time:
Or the picker (iOS-way) of picking time:DroidTimeSelection is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'DroidTimeSelection'
First of all, make sure to import "DroidTimeSelection" in all places you intend to use this.
The creation methods to all types of selectors (nested in view controller or just the view itself) can be accessed simply by calling:
DroidFactory.<SelectorType>.<DisplayType>()
To get the current time value from a selector accessed via:
let currentTime = selector.time
To change the time format for a selector:
selector.timeFormat = .twentyFour //or twelve
See TimeFormat
object for more info.
To set a selector's time value call:
selector.set(time: existingTime)
//or
selector.set(hour: 0, minutes: 0, am: false)
See Time
object for more info.
All selectors will call this callback when their value changes (every time it changes, not just when its selected)
selector.onSelectionChanged = { time in
//Do something
}
To reset a selector, which sets time to 00:00 or 12am, depending on the selected timeFormat
, simply call:
selector.reset()
To style a selector access it's style property:
selector.style.<property> = <value>
See HybridStyle
, ClockStyle
and PickerStyle
for more info about what can be customized.
You can give the user the ability to toggle the picker/clock mode manually by setting showToggleButton
to true
.
You can set the mode manually by calling:
selector.mode = .clock //or .picker
- View Controller This is the simplest way to display all selectors without any hassle. It allows toggling clock and picker modes, easily customizable and already has submit and cancel buttons. To create one:
let vc = DroidFactory.Hybrid.viewController()
vc.selector.onCancelTapped = {
vc.dismiss(animated: true, completion: nil)
}
vc.selector.onOkTapped = {
vc.dismiss(animated: true, completion: nil)
}
vc.selector.onSelectionChanged = { [weak self] value in
print("TimeInterval: \(value.timeInterval)")
}
present(vc, animated: true, completion: nil)
This can be customized further by providing a timeFormat
and a style
to the creation method:
var style = HybridStyle()
style.picker.titleColor = .white
style.clock.indicatorColor = .blue
style.modeButtonTint = .red
let vc = DroidFactory
.Hybrid
.viewController(timeFormat: .twentyFour, style: style)
- View
You can display the HybridSelector as a subview of anything you'd like. To create the view version simply call:
let view = DroidFactory.Hybrid.view()
The timeFormat
and style
parameters are the same as ...viewController()
- View
To display the clock selector individually you need to create the Clock Selector view and embed it as a subview. To do that, simply:
let view = DroidFactory.Clock.view()
view.onSelectionChanged = { [weak self] value in
//Value changed
}
view.onSelectionEnded = { [weak self] value in
//Both hours and minutes were selected.
}
//Use AutoLayout or set frame for the view.
This can be customized further by providing a timeFormat
and a style
to the creation method:
var style = ClockStyle()
style.indicatorColor = .blue
let view = DroidFactory
.Clock
.view(timeFormat: .twentyFour, style: style)
See TimeFormat
and ClockStyle
objects for more information about styling.
- View Controller
If you want to use the provided ViewController simply use the HybridViewController, set the
mode to .clock
and disable the toggle button by setting showToggleButton
to false
in
the style.
var style = HybridStyle()
style.showToggleButton = false
let vc = DroidFactory
.Hybrid
.viewController(timeFormat: .twentyFour, style: style)
vc.selector.mode = .clock
//Do something with the view controller
- View
To display the picker selector individually you need to create the Picker Selector view and embed it as a subview. To do that, simply:
let view = DroidFactory.Picker.view()
view.onSelectionChanged = { [weak self] value in
//Value changed
}
//Use AutoLayout or set frame for the view.
This can be customized further by providing a timeFormat
and a style
to the creation method:
var style = PickerStyle()
style.titleColor = .blue
let view = DroidFactory
.Picker
.view(timeFormat: .twentyFour, style: style)
See TimeFormat
and PickerStyle
objects for more information about styling.
- View Controller
If you want to use the provided ViewController simply use the HybridViewController, set the
mode to .picker
and disable the toggle button by setting showToggleButton
to false
in
the style.
var style = HybridStyle()
style.showToggleButton = false
let vc = DroidFactory
.Hybrid
.viewController(timeFormat: .twentyFour, style: style)
vc.selector.mode = .picker
//Do something with the view controller
All 3 selectors are IBDesignable and can be used inside a storyboard. To use any of them, simply:
- Drag a UIView inside.
- Change its class to
DroidHybridSelector
,DroidClockSelector
orDroidPickerSelector
. - Make sure to drag it as an IBOutlet to your view controller and then bind its callbacks, style it, etc.
You can use the same Time Indicator being used in the ClockSelector to display the time in any other context. You can either create it programmatically:
let view = DroidTimeIndicatorView()
Or drag a UIView, in a storyboard, and give it the class of DroidTimeIndicatorView
.
All the relevant properties of DroidTimeIndicatorView (other than fonts) are inspectable.
You can use the same Clock View, for physical clock selection, being used in the ClockSelector for any other context. You can either create it programmatically:
let view = DroidClockCollectionView()
Or drag a UIView, in a storyboard, and give it the class of DroidClockCollectionView
.
All the relevant properties of DroidClockCollectionView (other than fonts) are inspectable.
You can style the following properties:
outerCircleTextColor
: the text color for the entries in the outer clock circleouterCircleBackgroundColor
: the background color for the entries in the outer clock circleinnerCircleTextColor
: the text color for the entries in the inner clock circleinnerCircleBackgroundColor
: the background color for the entries in the inner clock circlselectedColor
: the color for the current time unit being selected. Example: if hour is currently being selected then the HH of the HH:MM label will be colored with this color.deselectedColor
: the color for the current time unit being selected. Example: if hour is currently being selected then the MM of the HH:MM label will be colored with this color.indicatorColor
: the color for the line and circle indicator in the physical clock.selectionFont
: the font for the HH:MM time label.numbersFont
: the font for all the entries in the physical clock.- Warning: the sizes of provided fonts will be ignored to avoid having the layout broken by extreme sizes.
titleColor
: the text color for the selector's title.titleFont
: the font for the selector's title.titleText
: the text in the selector's title.pickerFont
: the font for the picker entries.pickerColor
: the text color for the picker entries.- Warning: the sizes of provided fonts will be ignored to avoid having the layout broken by extreme sizes.
showToggleButton
: whether you want the hybrid selector to allow user to toggle between Clock and Picker manually.modeButtonTint
: the color for the toggle selection button.pickerModeButtonContent
: the button type for the 'Picker Selection' mode.clockModeButtonContent
: the button type for the 'Clock Selection' mode.cancelButtonContent
: the button type for the cancel button.submitButtonContent
: the button type for the submit button.cancelButtonColor
: the color for the cancel button.submitButtonColor
: the color for the submit button.clock
: the styling for the inner Clock Selector. SeeClockStyle
for more info.picker
: the styling for the inner Picker Selector. SeePickerStyle
for more info.- Warning: the sizes of provided fonts will be ignored to avoid having the layout broken by extreme sizes.
To run the example project, clone the repo, and run pod install
from the Example directory first.
- iOS 11 or above.
DDraiman1990, ddraiman1990@gmail.com a.k.a Nexxmark Studio.
DroidTimeSelection is available under the MIT license. See the LICENSE file for more info.
The original icon was mixed from an icon made by Those Icons and Freepik both from www.flaticon.com.