Skip to content

Commit efd19d6

Browse files
author
Ahmet Sina Ustem
committed
MonthAndDatePicker input type added
1 parent e4a4372 commit efd19d6

41 files changed

Lines changed: 7871 additions & 1065 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
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+

Example/ALFormInput.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
35ACD48C2445D3180087512C /* ALDatePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35ACD48B2445D3180087512C /* ALDatePicker.swift */; };
1212
35ACD48E2445D8A70087512C /* AL+ActionSheetPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35ACD48D2445D8A70087512C /* AL+ActionSheetPicker.swift */; };
1313
35ACD4902445E32A0087512C /* ALStringPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35ACD48F2445E32A0087512C /* ALStringPicker.swift */; };
14+
35ACD4932446016D0087512C /* ALMonthAndYearPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35ACD4922446016D0087512C /* ALMonthAndYearPicker.swift */; };
1415
35DBD22524459AE3008A8144 /* ALValidatableTextFieldType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBD1FC24459AE3008A8144 /* ALValidatableTextFieldType.swift */; };
1516
35DBD22624459AE3008A8144 /* ALValidatableTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBD1FD24459AE3008A8144 /* ALValidatableTextField.swift */; };
1617
35DBD22724459AE3008A8144 /* .gitkeep in Resources */ = {isa = PBXBuildFile; fileRef = 35DBD1FE24459AE3008A8144 /* .gitkeep */; };
@@ -47,6 +48,7 @@
4748
35ACD48B2445D3180087512C /* ALDatePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ALDatePicker.swift; sourceTree = "<group>"; };
4849
35ACD48D2445D8A70087512C /* AL+ActionSheetPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AL+ActionSheetPicker.swift"; sourceTree = "<group>"; };
4950
35ACD48F2445E32A0087512C /* ALStringPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ALStringPicker.swift; sourceTree = "<group>"; };
51+
35ACD4922446016D0087512C /* ALMonthAndYearPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ALMonthAndYearPicker.swift; sourceTree = "<group>"; };
5052
35DBD1FC24459AE3008A8144 /* ALValidatableTextFieldType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ALValidatableTextFieldType.swift; sourceTree = "<group>"; };
5153
35DBD1FD24459AE3008A8144 /* ALValidatableTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ALValidatableTextField.swift; sourceTree = "<group>"; };
5254
35DBD1FE24459AE3008A8144 /* .gitkeep */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .gitkeep; sourceTree = "<group>"; };
@@ -108,6 +110,7 @@
108110
35DBD20524459AE3008A8144 /* Extensions */,
109111
35DBD20824459AE3008A8144 /* ValidatorRules */,
110112
35DBD22424459AE3008A8144 /* ALValidatableConfig.swift */,
113+
35ACD4922446016D0087512C /* ALMonthAndYearPicker.swift */,
111114
);
112115
name = Classes;
113116
path = ../ALFormInput/Classes;
@@ -363,6 +366,7 @@
363366
"${BUILT_PRODUCTS_DIR}/ALFormInput/ALFormInput.framework",
364367
"${BUILT_PRODUCTS_DIR}/ActionSheetPicker-3.0/ActionSheetPicker_3_0.framework",
365368
"${BUILT_PRODUCTS_DIR}/AlExtensions/AlExtensions.framework",
369+
"${BUILT_PRODUCTS_DIR}/FontAwesome.swift/FontAwesome_swift.framework",
366370
"${BUILT_PRODUCTS_DIR}/PhoneNumberKit/PhoneNumberKit.framework",
367371
"${BUILT_PRODUCTS_DIR}/SkyFloatingLabelTextField/SkyFloatingLabelTextField.framework",
368372
"${BUILT_PRODUCTS_DIR}/SwiftValidatorNew/SwiftValidatorNew.framework",
@@ -372,6 +376,7 @@
372376
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ALFormInput.framework",
373377
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ActionSheetPicker_3_0.framework",
374378
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AlExtensions.framework",
379+
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FontAwesome_swift.framework",
375380
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PhoneNumberKit.framework",
376381
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SkyFloatingLabelTextField.framework",
377382
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftValidatorNew.framework",
@@ -438,6 +443,7 @@
438443
35DBD23624459AE3008A8144 /* CardNumberRule.swift in Sources */,
439444
607FACD81AFB9204008FA782 /* ViewController.swift in Sources */,
440445
35ACD48E2445D8A70087512C /* AL+ActionSheetPicker.swift in Sources */,
446+
35ACD4932446016D0087512C /* ALMonthAndYearPicker.swift in Sources */,
441447
35DBD22624459AE3008A8144 /* ALValidatableTextField.swift in Sources */,
442448
35DBD22F24459AE3008A8144 /* CustomPhoneNumberRule.swift in Sources */,
443449
35DBD24224459AE3008A8144 /* CreditCardType.swift in Sources */,

Example/ALFormInput/Base.lproj/Main.storyboard

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,56 +20,61 @@
2020
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
2121
<subviews>
2222
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="RMs-5X-003">
23-
<rect key="frame" x="32" y="16" width="311" height="400"/>
23+
<rect key="frame" x="32" y="16" width="311" height="450"/>
2424
<subviews>
2525
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="7Cr-lj-vd8" customClass="ALValidatableTextField" customModule="ALFormInput_Example" customModuleProvider="target">
26-
<rect key="frame" x="0.0" y="0.0" width="311" height="35.5"/>
26+
<rect key="frame" x="0.0" y="0.0" width="311" height="36"/>
2727
<fontDescription key="fontDescription" type="system" pointSize="14"/>
2828
<textInputTraits key="textInputTraits"/>
2929
</textField>
3030
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="A4O-q3-QNO" customClass="ALValidatableTextField" customModule="ALFormInput_Example" customModuleProvider="target">
31-
<rect key="frame" x="0.0" y="45.5" width="311" height="35.5"/>
31+
<rect key="frame" x="0.0" y="46" width="311" height="36"/>
3232
<fontDescription key="fontDescription" type="system" pointSize="14"/>
3333
<textInputTraits key="textInputTraits"/>
3434
</textField>
3535
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="h5q-vy-mph" customClass="ALValidatableTextField" customModule="ALFormInput_Example" customModuleProvider="target">
36-
<rect key="frame" x="0.0" y="91" width="311" height="35.5"/>
36+
<rect key="frame" x="0.0" y="92" width="311" height="36"/>
3737
<fontDescription key="fontDescription" type="system" pointSize="14"/>
3838
<textInputTraits key="textInputTraits"/>
3939
</textField>
4040
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="INh-u7-v37" customClass="ALValidatableTextField" customModule="ALFormInput_Example" customModuleProvider="target">
41-
<rect key="frame" x="0.0" y="136.5" width="311" height="35.5"/>
41+
<rect key="frame" x="0.0" y="138" width="311" height="36"/>
4242
<fontDescription key="fontDescription" type="system" pointSize="14"/>
4343
<textInputTraits key="textInputTraits"/>
4444
</textField>
4545
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="DVW-vA-19E" customClass="ALValidatableTextField" customModule="ALFormInput_Example" customModuleProvider="target">
46-
<rect key="frame" x="0.0" y="182" width="311" height="36"/>
46+
<rect key="frame" x="0.0" y="184" width="311" height="36"/>
4747
<fontDescription key="fontDescription" type="system" pointSize="14"/>
4848
<textInputTraits key="textInputTraits"/>
4949
</textField>
5050
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="dcF-uq-Kie" customClass="ALValidatableTextField" customModule="ALFormInput_Example" customModuleProvider="target">
51-
<rect key="frame" x="0.0" y="228" width="311" height="35.5"/>
51+
<rect key="frame" x="0.0" y="230" width="311" height="36"/>
5252
<fontDescription key="fontDescription" type="system" pointSize="14"/>
5353
<textInputTraits key="textInputTraits"/>
5454
</textField>
5555
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="umL-iv-Uiv" customClass="ALValidatableTextField" customModule="ALFormInput_Example" customModuleProvider="target">
56-
<rect key="frame" x="0.0" y="273.5" width="311" height="35.5"/>
56+
<rect key="frame" x="0.0" y="276" width="311" height="36"/>
5757
<fontDescription key="fontDescription" type="system" pointSize="14"/>
5858
<textInputTraits key="textInputTraits"/>
5959
</textField>
6060
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="AMc-Ci-7zB" customClass="ALDatePicker" customModule="ALFormInput_Example" customModuleProvider="target">
61-
<rect key="frame" x="0.0" y="319" width="311" height="35.5"/>
61+
<rect key="frame" x="0.0" y="322" width="311" height="36"/>
6262
<fontDescription key="fontDescription" type="system" pointSize="14"/>
6363
<textInputTraits key="textInputTraits"/>
6464
</textField>
6565
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="0fv-Cc-gg0" customClass="ALObjectPicker" customModule="ALFormInput_Example" customModuleProvider="target">
66-
<rect key="frame" x="0.0" y="364.5" width="311" height="35.5"/>
66+
<rect key="frame" x="0.0" y="368" width="311" height="36"/>
67+
<fontDescription key="fontDescription" type="system" pointSize="14"/>
68+
<textInputTraits key="textInputTraits"/>
69+
</textField>
70+
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="Mje-qQ-7QB" customClass="ALMonthAndYearPicker" customModule="ALFormInput_Example" customModuleProvider="target">
71+
<rect key="frame" x="0.0" y="414" width="311" height="36"/>
6772
<fontDescription key="fontDescription" type="system" pointSize="14"/>
6873
<textInputTraits key="textInputTraits"/>
6974
</textField>
7075
</subviews>
7176
<constraints>
72-
<constraint firstAttribute="height" constant="400" id="PZj-AO-fQI"/>
77+
<constraint firstAttribute="height" constant="450" id="PZj-AO-fQI"/>
7378
</constraints>
7479
</stackView>
7580
</subviews>
@@ -85,6 +90,7 @@
8590
<outlet property="creditCardNumberTextField" destination="dcF-uq-Kie" id="7Qy-zS-EZE"/>
8691
<outlet property="datePicker" destination="AMc-Ci-7zB" id="mSD-NF-Poy"/>
8792
<outlet property="emailTextField" destination="7Cr-lj-vd8" id="UZR-YX-gOT"/>
93+
<outlet property="monthAndYearPicker" destination="Mje-qQ-7QB" id="SZB-e2-ekz"/>
8894
<outlet property="nameTextField" destination="h5q-vy-mph" id="2y8-96-Enm"/>
8995
<outlet property="objectPicker" destination="0fv-Cc-gg0" id="mvL-0o-JZS"/>
9096
<outlet property="passwordTextField" destination="A4O-q3-QNO" id="Fe8-AT-NVU"/>

0 commit comments

Comments
 (0)