Skip to content

Commit 5da2315

Browse files
committed
Added RxSwift Support
1 parent 11dc792 commit 5da2315

File tree

334 files changed

+33028
-145
lines changed

Some content is hidden

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

334 files changed

+33028
-145
lines changed

SwiftyCodeView.podspec

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
Pod::Spec.new do |s|
1010
s.swift_version = '4.1'
1111
s.name = 'SwiftyCodeView'
12-
s.version = '0.1.0'
12+
s.version = '0.1.1'
1313
s.summary = 'An UI Component for verification codes written in swift'
1414

1515
s.description = <<-DESC
@@ -20,11 +20,19 @@ Pod::Spec.new do |s|
2020
s.license = { :type => 'MIT', :file => 'LICENSE' }
2121
s.author = { 'arturdev' => 'mkrtarturdev@gmail.com' }
2222
s.source = { :git => 'https://github.com/arturdev/SwiftyCodeView.git', :tag => s.version.to_s }
23-
2423
s.ios.deployment_target = '9.3'
24+
s.default_subspec = "Core"
25+
26+
s.subspec "Core" do |ss|
27+
ss.source_files = 'SwiftyCodeView/Classes/SwiftyCodeView/*'
28+
ss.frameworks = 'UIKit'
29+
end
30+
31+
s.subspec "RxSwift" do |ss|
32+
ss.source_files = "SwiftyCodeView/Classes/RxSwiftyCodeView/*"
33+
ss.dependency "SwiftyCodeView/Core"
34+
ss.dependency "RxSwift", "~> 4.1.2"
35+
ss.dependency "RxCocoa", "~> 4.1.2"
36+
end
2537

26-
s.source_files = 'SwiftyCodeView/Classes/*'
27-
28-
# s.public_header_files = 'Pod/Classes/**/*.h'
29-
s.frameworks = 'UIKit'
3038
end
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//
2+
// SwiftyCodeView.swift
3+
//
4+
// Created by arturdev on 6/28/18.
5+
//
6+
7+
import UIKit
8+
9+
#if canImport(RxCocoa)
10+
import RxSwift
11+
import RxCocoa
12+
extension Reactive where Base: SwiftyCodeView {
13+
14+
/// Reactive wrapper for `code` property.
15+
internal var code: ControlProperty<String> {
16+
return controlProperty(editingEvents: [.allEditingEvents, .valueChanged],
17+
getter: { codeView in
18+
codeView.code
19+
}, setter: { codeView, value in
20+
codeView.code = value
21+
})
22+
}
23+
}
24+
#endif

SwiftyCodeView/Classes/SwiftyCodeItemView.swift renamed to SwiftyCodeView/Classes/SwiftyCodeView/SwiftyCodeItemView.swift

File renamed without changes.
File renamed without changes.

SwiftyCodeView/Classes/SwiftyCodeTextField.swift renamed to SwiftyCodeView/Classes/SwiftyCodeView/SwiftyCodeTextField.swift

File renamed without changes.
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
//
2+
// SwiftyCodeView.swift
3+
//
4+
// Created by arturdev on 6/28/18.
5+
//
6+
7+
import UIKit
8+
9+
@objc
10+
public protocol SwiftyCodeViewDelegate: class {
11+
func codeView(sender: SwiftyCodeView, didFinishInput code: String)
12+
}
13+
14+
@IBDesignable
15+
open class SwiftyCodeView: UIControl {
16+
@IBInspectable open var length: Int = 4 {
17+
didSet {
18+
setupUI()
19+
}
20+
}
21+
22+
@IBOutlet open weak var delegate: SwiftyCodeViewDelegate?
23+
24+
var stackView: UIStackView = {
25+
let stackView = UIStackView()
26+
stackView.axis = .horizontal
27+
stackView.distribution = .equalSpacing
28+
stackView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
29+
return stackView
30+
}()
31+
32+
fileprivate var items: [SwiftyCodeItemView] = []
33+
open var code: String {
34+
get {
35+
let items = stackView.arrangedSubviews.map({$0 as! SwiftyCodeItemView})
36+
let values = items.map({$0.textField.text ?? ""})
37+
return values.joined()
38+
}
39+
set {
40+
let array = newValue.map(String.init)
41+
for i in 0..<array.count {
42+
let item = stackView.arrangedSubviews[i] as! SwiftyCodeItemView
43+
item.textField.text = array[i]
44+
}
45+
}
46+
}
47+
48+
override open func awakeFromNib() {
49+
super.awakeFromNib()
50+
setupUI()
51+
52+
let tap = UITapGestureRecognizer(target: self, action: #selector(becomeFirstResponder))
53+
addGestureRecognizer(tap)
54+
}
55+
56+
fileprivate func setupUI() {
57+
stackView.frame = self.bounds
58+
if stackView.superview == nil {
59+
addSubview(stackView)
60+
}
61+
stackView.arrangedSubviews.forEach{($0.removeFromSuperview())}
62+
63+
for i in 0..<length {
64+
let itemView = generateItem()
65+
itemView.textField.deleteDelegate = self
66+
itemView.textField.delegate = self
67+
itemView.tag = i
68+
itemView.textField.tag = i
69+
stackView.addArrangedSubview(itemView)
70+
}
71+
}
72+
73+
open func generateItem() -> SwiftyCodeItemView {
74+
let type = SwiftyCodeItemView.self
75+
let typeStr = type.description().components(separatedBy: ".").last ?? ""
76+
let bundle = Bundle(for: type)
77+
return bundle
78+
.loadNibNamed(typeStr,
79+
owner: nil,
80+
options: nil)?
81+
.last as! SwiftyCodeItemView
82+
}
83+
84+
override open func becomeFirstResponder() -> Bool {
85+
let items = stackView.arrangedSubviews
86+
.map({$0 as! SwiftyCodeItemView})
87+
return (items.filter({($0.textField.text ?? "").isEmpty}).first ?? items.last)!.becomeFirstResponder()
88+
}
89+
90+
override open func resignFirstResponder() -> Bool {
91+
stackView.arrangedSubviews.forEach({$0.resignFirstResponder()})
92+
return true
93+
}
94+
95+
override open func prepareForInterfaceBuilder() {
96+
super.prepareForInterfaceBuilder()
97+
setupUI()
98+
}
99+
}
100+
101+
extension SwiftyCodeView: UITextFieldDelegate, SwiftyCodeTextFieldDelegate {
102+
103+
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
104+
105+
if string == "" { //is backspace
106+
return true
107+
}
108+
109+
if !textField.hasText {
110+
let index = textField.tag
111+
let item = stackView.arrangedSubviews[index] as! SwiftyCodeItemView
112+
item.textField.text = string
113+
sendActions(for: .valueChanged)
114+
if index == length - 1 { //is last textfield
115+
delegate?.codeView(sender: self, didFinishInput: self.code)
116+
textField.resignFirstResponder()
117+
return false
118+
}
119+
120+
_ = stackView.arrangedSubviews[index + 1].becomeFirstResponder()
121+
}
122+
123+
return false
124+
}
125+
126+
public func deleteBackward(sender: SwiftyCodeTextField) {
127+
for i in 1..<length{
128+
let itemView = stackView.arrangedSubviews[i] as! SwiftyCodeItemView
129+
130+
if !itemView.textField.isFirstResponder {
131+
continue
132+
}
133+
134+
let prevItem = stackView.arrangedSubviews[i-1] as! SwiftyCodeItemView
135+
_ = prevItem.becomeFirstResponder()
136+
prevItem.textField.text = ""
137+
}
138+
sendActions(for: .valueChanged)
139+
}
140+
}

SwiftyCodeViewDemo/Podfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ target 'SwiftyCodeViewDemo' do
66
use_frameworks!
77

88
# Pods for SwiftyCodeViewDemo
9-
pod 'SwiftyCodeView', :path => '/Users/artur/Desktop/Pod/SwiftyCodeView'
9+
pod 'SwiftyCodeView'
1010

1111
end

SwiftyCodeViewDemo/Podfile.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ PODS:
22
- SwiftyCodeView (0.1.0)
33

44
DEPENDENCIES:
5-
- SwiftyCodeView (from `/Users/artur/Desktop/Pod/SwiftyCodeView`)
5+
- SwiftyCodeView
66

7-
EXTERNAL SOURCES:
8-
SwiftyCodeView:
9-
:path: "/Users/artur/Desktop/Pod/SwiftyCodeView"
7+
SPEC REPOS:
8+
https://github.com/cocoapods/specs.git:
9+
- SwiftyCodeView
1010

1111
SPEC CHECKSUMS:
12-
SwiftyCodeView: 3e4b6014f9ca3fbbe748defe41c06453186e0a99
12+
SwiftyCodeView: 40bff9f5c5bd7b85e32cbc829fe9f42233f5cb73
1313

14-
PODFILE CHECKSUM: 9a36df8c88efaa4eab105b6f0bd689f5d3741cf7
14+
PODFILE CHECKSUM: 6e513ded0496c9fc38b7677dc33c509fb7de5c02
1515

1616
COCOAPODS: 1.5.3

SwiftyCodeViewDemo/Pods/Local Podspecs/SwiftyCodeView.podspec.json

Lines changed: 0 additions & 24 deletions
This file was deleted.

SwiftyCodeViewDemo/Pods/Manifest.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)