Skip to content

Commit 3c8f868

Browse files
authored
Merge pull request #6 from ahmetsina/development
Added DatePicker, ObjectPicker and CoC
2 parents 2a8c754 + f5beaa7 commit 3c8f868

100 files changed

Lines changed: 13248 additions & 852 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ALFormInput.podspec

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,8 @@ Pod::Spec.new do |s|
2323
s.dependency 'SkyFloatingLabelTextField', '~> 3.0'
2424
s.dependency 'PhoneNumberKit', '~> 3.1'
2525
s.dependency 'SwiftValidatorNew', '~> 4.2.0'
26+
s.dependency 'ActionSheetPicker-3.0'
27+
s.dependency 'AlExtensions'
28+
s.dependency 'FontAwesome.swift'
29+
2630
end
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
//
2+
// ALDatePicker.swift
3+
// ALFormInput_Example
4+
//
5+
// Created by AppLogist on 14.04.2020.
6+
// Copyright © 2020 CocoaPods. All rights reserved.
7+
//
8+
9+
import SwiftValidatorNew
10+
import ActionSheetPicker_3_0
11+
import AlExtensions
12+
13+
public protocol ALDatePickerDelegate: class {
14+
func didSelectDate(_ view: ALDatePicker, selectedDate: Date)
15+
}
16+
17+
18+
public class ALDatePicker: ALValidatableTextField {
19+
20+
weak var datePickerDelegate: ALDatePickerDelegate?
21+
private var datePickerMode: UIDatePickerMode?
22+
private var minDate: Date?
23+
private var maxDate: Date?
24+
private var showFormat: String = "HH/mm/yyyy"
25+
private var locale: Locale?
26+
public var selectedDate: Date?
27+
28+
public override init(rules: [Rule], config: ALTextFieldConfig) {
29+
super.init(rules: rules, config: config)
30+
delegate = self
31+
setDropDownIcon()
32+
}
33+
34+
public required init?(coder: NSCoder) {
35+
super.init(coder: coder)
36+
delegate = self
37+
setDropDownIcon()
38+
}
39+
40+
public func setupPicker(pickerMode: UIDatePickerMode? = nil,
41+
minDate: Date? = nil,
42+
maxDate: Date? = nil,
43+
locale: Locale? = Locale.current,
44+
dateShowFormat: String = "HH/mm/yyyy") {
45+
self.datePickerMode = pickerMode
46+
self.minDate = minDate
47+
self.maxDate = maxDate
48+
self.locale = locale
49+
self.showFormat = dateShowFormat
50+
}
51+
52+
private func showActionSheetDatePicker() {
53+
let picker = ActionSheetDatePicker(title: title,
54+
datePickerMode: datePickerMode ?? UIDatePickerMode.date,
55+
selectedDate: selectedDate ?? Date(),
56+
doneBlock: { (_, selectedDate, _) in
57+
guard let selectedDate = selectedDate as? Date else { return }
58+
self.selectedDate = selectedDate
59+
self.text = selectedDate.formatted(format: self.showFormat)
60+
self.datePickerDelegate?.didSelectDate(self, selectedDate: selectedDate)
61+
},
62+
cancel: nil,
63+
origin: self)
64+
if let minDate = self.minDate {
65+
picker?.minimumDate = minDate
66+
}
67+
if let maxDate = self.maxDate {
68+
picker?.maximumDate = maxDate
69+
}
70+
if let locale = self.locale {
71+
picker?.locale = locale
72+
}
73+
picker?.addButtons()
74+
picker?.show()
75+
}
76+
77+
78+
}
79+
80+
// MARK: - UITextFieldDelegate
81+
extension ALDatePicker: UITextFieldDelegate {
82+
public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
83+
showActionSheetDatePicker()
84+
return false
85+
}
86+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
//
2+
// ALMonthAndYearPicker.swift
3+
// ALFormInput_Example
4+
//
5+
// Created by AppLogist on 14.04.2020.
6+
// Copyright © 2020 CocoaPods. All rights reserved.
7+
//
8+
9+
import ActionSheetPicker_3_0
10+
11+
public enum ALMonthAndYearPickerFormat {
12+
/// 01/2020
13+
case withNumeric
14+
/// January 2020
15+
case withMonthSymbol
16+
}
17+
18+
public class ALMonthAndYearPicker: ALDatePicker {
19+
20+
// Formats: 01/2020, January 2020
21+
22+
private var monthSymbols = DateFormatter().monthSymbols
23+
private var format: ALMonthAndYearPickerFormat? = .withNumeric
24+
25+
private var minYear: Int? = Calendar.current.dateComponents([.year], from: Date()).year ?? 0
26+
private var maxYear: Int? = (Calendar.current.dateComponents([.year], from: Date()).year ?? 0) + 20
27+
private var selectedIndexes: [Int]?
28+
29+
30+
/// You can get a certain day with setting this variable. Default value is **1**
31+
public var day: Int = 1
32+
33+
private func convertToDate(month: Int, year: Int) -> Date? {
34+
let components = DateComponents(calendar: .current,
35+
timeZone: .current,
36+
year: year,
37+
month: month,
38+
day: day)
39+
return Calendar.current.date(from: components)
40+
}
41+
42+
43+
/// You can setup datepicker minimum year and maximum year
44+
/// - Parameters:
45+
/// - minYear: Minimum Year
46+
/// - maxYear: Maximum Year
47+
/// - format: Format for display (default `.withNumeric`)
48+
public func setup(minYear: Int? = Calendar.current.dateComponents([.year], from: Date()).year ?? 0,
49+
maxYear: Int? = (Calendar.current.dateComponents([.year], from: Date()).year ?? 0) + 20,
50+
format: ALMonthAndYearPickerFormat = .withNumeric) {
51+
self.minYear = minYear
52+
self.maxYear = maxYear
53+
self.format = format
54+
}
55+
56+
57+
58+
private func showActionSheetDatePicker() {
59+
guard let minYear = minYear, let maxYear = maxYear else { return }
60+
let years = (minYear...maxYear).map { "\($0)"}
61+
let months = format == .withNumeric ? monthSymbols?.compactMap{ String((monthSymbols?.index(of: $0) ?? 0) + 1)} : (monthSymbols ?? [])
62+
let picker = ActionSheetMultipleStringPicker(title: title,
63+
rows: [months ?? [], years ],
64+
initialSelection: selectedIndexes ?? [0,0] ,
65+
doneBlock: { [weak self] (_, indexes, _) in
66+
guard let self = self else { return }
67+
guard let indexes = indexes as? [Int] else { return }
68+
self.selectedIndexes = indexes
69+
let month = months?[indexes[0]] ?? ""
70+
71+
let year = years[indexes[1]]
72+
73+
if let year = Int(year),
74+
let monthIndex = indexes.first,
75+
let selectedDate = self.convertToDate(month: monthIndex + 1,
76+
year: year) {
77+
self.datePickerDelegate?.didSelectDate(self, selectedDate: selectedDate)
78+
self.selectedDate = selectedDate
79+
}
80+
81+
if self.format == .withNumeric {
82+
let month = String(format:"%02d",(indexes.first ?? 0) + 1)
83+
self.text = "\(month)/\(year)"
84+
return
85+
}
86+
self.text = "\(month) \(year)"
87+
88+
},
89+
cancel: nil,
90+
origin: self)
91+
92+
93+
picker?.addButtons()
94+
picker?.show()
95+
}
96+
97+
public override func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
98+
showActionSheetDatePicker()
99+
return false
100+
}
101+
}
102+
103+
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
//
2+
// ALStringPicker.swift
3+
// ALFormInput_Example
4+
//
5+
// Created by AppLogist on 14.04.2020.
6+
// Copyright © 2020 CocoaPods. All rights reserved.
7+
//
8+
9+
import SwiftValidatorNew
10+
import ActionSheetPicker_3_0
11+
import AlExtensions
12+
13+
public protocol ALPickable {
14+
var stringForShowingInPickerView: String? { get }
15+
}
16+
17+
public protocol ALObjectPickerDelegate: class {
18+
func didSelectObject(_ view: ALObjectPicker, selectedObject: ALPickable, selectedIndex: Int)
19+
}
20+
21+
22+
public class ALObjectPicker: ALValidatableTextField {
23+
24+
weak var objectPickerDelegate: ALObjectPickerDelegate?
25+
private var objects : [ALPickable]?
26+
private var selectedObject: ALPickable?
27+
28+
public override init(rules: [Rule], config: ALTextFieldConfig) {
29+
super.init(rules: rules, config: config)
30+
delegate = self
31+
setDropDownIcon()
32+
}
33+
34+
public required init?(coder: NSCoder) {
35+
super.init(coder: coder)
36+
delegate = self
37+
setDropDownIcon()
38+
}
39+
40+
public func setupPicker(objects: [ALPickable]? = nil, selectedObject: ALPickable? = nil) {
41+
self.objects = objects
42+
self.selectedObject = selectedObject
43+
if let selectedObject = selectedObject {
44+
text = selectedObject.stringForShowingInPickerView
45+
}
46+
}
47+
48+
private func showActionSheetStringPicker() {
49+
guard let objects = objects, !objects.isEmpty else {
50+
assertionFailure("Strings array must be set and must not be empty")
51+
return
52+
}
53+
/// - TODO: This is negotiable (What if picker view can contains same strings?)
54+
let initialSelection = Int(objects.firstIndex(where: { $0.stringForShowingInPickerView == selectedObject?.stringForShowingInPickerView }) ?? 0)
55+
let rows = objects.compactMap{ $0.stringForShowingInPickerView ?? ""}
56+
let picker = ActionSheetStringPicker(title: title,
57+
rows: rows,
58+
initialSelection: initialSelection,
59+
doneBlock: { [weak self] (_, selectedIndex, _) in
60+
guard let self = self else { return }
61+
let selectedObject = objects[selectedIndex]
62+
self.selectedObject = selectedObject
63+
self.text = selectedObject.stringForShowingInPickerView
64+
self.objectPickerDelegate?.didSelectObject(self,
65+
selectedObject: selectedObject,
66+
selectedIndex: selectedIndex)
67+
},
68+
cancel: nil,
69+
origin: self)
70+
picker?.addButtons()
71+
picker?.show()
72+
}
73+
74+
75+
}
76+
77+
// MARK: - ALObjectPicker
78+
extension ALObjectPicker: UITextFieldDelegate {
79+
public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
80+
showActionSheetStringPicker()
81+
return false
82+
}
83+
}

ALFormInput/Classes/ALValidatableConfig.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77

88
import UIKit
9+
import SkyFloatingLabelTextField
910

1011
public class ALTextFieldConfig {
1112
static let shared = ALTextFieldConfig()
@@ -57,6 +58,21 @@ public class ALTextFieldConfig {
5758

5859
public var validateEventType: UIControl.Event = .editingDidEnd
5960

61+
public var iconType: IconType = .image
62+
63+
public var iconColor: UIColor {
64+
titleColor
65+
}
66+
67+
public var selectedIconColor: UIColor {
68+
selectedTitleColor
69+
}
70+
71+
public var iconWidth: CGFloat {
72+
isIconVisible ? 20 : -4
73+
}
74+
75+
public var isIconVisible: Bool = false
6076

6177
public init () {}
6278
}

0 commit comments

Comments
 (0)