Skip to content

Commit

Permalink
Added RxSwift Support
Browse files Browse the repository at this point in the history
  • Loading branch information
arturdev committed Jun 29, 2018
1 parent 11dc792 commit 5da2315
Show file tree
Hide file tree
Showing 334 changed files with 33,028 additions and 145 deletions.
20 changes: 14 additions & 6 deletions SwiftyCodeView.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
Pod::Spec.new do |s|
s.swift_version = '4.1'
s.name = 'SwiftyCodeView'
s.version = '0.1.0'
s.version = '0.1.1'
s.summary = 'An UI Component for verification codes written in swift'

s.description = <<-DESC
Expand All @@ -20,11 +20,19 @@ Pod::Spec.new do |s|
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'arturdev' => '[email protected]' }
s.source = { :git => 'https://github.com/arturdev/SwiftyCodeView.git', :tag => s.version.to_s }

s.ios.deployment_target = '9.3'
s.default_subspec = "Core"

s.subspec "Core" do |ss|
ss.source_files = 'SwiftyCodeView/Classes/SwiftyCodeView/*'
ss.frameworks = 'UIKit'
end

s.subspec "RxSwift" do |ss|
ss.source_files = "SwiftyCodeView/Classes/RxSwiftyCodeView/*"
ss.dependency "SwiftyCodeView/Core"
ss.dependency "RxSwift", "~> 4.1.2"
ss.dependency "RxCocoa", "~> 4.1.2"
end

s.source_files = 'SwiftyCodeView/Classes/*'

# s.public_header_files = 'Pod/Classes/**/*.h'
s.frameworks = 'UIKit'
end
24 changes: 24 additions & 0 deletions SwiftyCodeView/Classes/RxSwiftyCodeView/SwiftyCodeView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//
// SwiftyCodeView.swift
//
// Created by arturdev on 6/28/18.
//

import UIKit

#if canImport(RxCocoa)
import RxSwift
import RxCocoa
extension Reactive where Base: SwiftyCodeView {

/// Reactive wrapper for `code` property.
internal var code: ControlProperty<String> {
return controlProperty(editingEvents: [.allEditingEvents, .valueChanged],
getter: { codeView in
codeView.code
}, setter: { codeView, value in
codeView.code = value
})
}
}
#endif
140 changes: 140 additions & 0 deletions SwiftyCodeView/Classes/SwiftyCodeView/SwiftyCodeView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
//
// SwiftyCodeView.swift
//
// Created by arturdev on 6/28/18.
//

import UIKit

@objc
public protocol SwiftyCodeViewDelegate: class {
func codeView(sender: SwiftyCodeView, didFinishInput code: String)
}

@IBDesignable
open class SwiftyCodeView: UIControl {
@IBInspectable open var length: Int = 4 {
didSet {
setupUI()
}
}

@IBOutlet open weak var delegate: SwiftyCodeViewDelegate?

var stackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.distribution = .equalSpacing
stackView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
return stackView
}()

fileprivate var items: [SwiftyCodeItemView] = []
open var code: String {
get {
let items = stackView.arrangedSubviews.map({$0 as! SwiftyCodeItemView})
let values = items.map({$0.textField.text ?? ""})
return values.joined()
}
set {
let array = newValue.map(String.init)
for i in 0..<array.count {
let item = stackView.arrangedSubviews[i] as! SwiftyCodeItemView
item.textField.text = array[i]
}
}
}

override open func awakeFromNib() {
super.awakeFromNib()
setupUI()

let tap = UITapGestureRecognizer(target: self, action: #selector(becomeFirstResponder))
addGestureRecognizer(tap)
}

fileprivate func setupUI() {
stackView.frame = self.bounds
if stackView.superview == nil {
addSubview(stackView)
}
stackView.arrangedSubviews.forEach{($0.removeFromSuperview())}

for i in 0..<length {
let itemView = generateItem()
itemView.textField.deleteDelegate = self
itemView.textField.delegate = self
itemView.tag = i
itemView.textField.tag = i
stackView.addArrangedSubview(itemView)
}
}

open func generateItem() -> SwiftyCodeItemView {
let type = SwiftyCodeItemView.self
let typeStr = type.description().components(separatedBy: ".").last ?? ""
let bundle = Bundle(for: type)
return bundle
.loadNibNamed(typeStr,
owner: nil,
options: nil)?
.last as! SwiftyCodeItemView
}

override open func becomeFirstResponder() -> Bool {
let items = stackView.arrangedSubviews
.map({$0 as! SwiftyCodeItemView})
return (items.filter({($0.textField.text ?? "").isEmpty}).first ?? items.last)!.becomeFirstResponder()
}

override open func resignFirstResponder() -> Bool {
stackView.arrangedSubviews.forEach({$0.resignFirstResponder()})
return true
}

override open func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
setupUI()
}
}

extension SwiftyCodeView: UITextFieldDelegate, SwiftyCodeTextFieldDelegate {

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

if string == "" { //is backspace
return true
}

if !textField.hasText {
let index = textField.tag
let item = stackView.arrangedSubviews[index] as! SwiftyCodeItemView
item.textField.text = string
sendActions(for: .valueChanged)
if index == length - 1 { //is last textfield
delegate?.codeView(sender: self, didFinishInput: self.code)
textField.resignFirstResponder()
return false
}

_ = stackView.arrangedSubviews[index + 1].becomeFirstResponder()
}

return false
}

public func deleteBackward(sender: SwiftyCodeTextField) {
for i in 1..<length{
let itemView = stackView.arrangedSubviews[i] as! SwiftyCodeItemView

if !itemView.textField.isFirstResponder {
continue
}

let prevItem = stackView.arrangedSubviews[i-1] as! SwiftyCodeItemView
_ = prevItem.becomeFirstResponder()
prevItem.textField.text = ""
}
sendActions(for: .valueChanged)
}
}
2 changes: 1 addition & 1 deletion SwiftyCodeViewDemo/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ target 'SwiftyCodeViewDemo' do
use_frameworks!

# Pods for SwiftyCodeViewDemo
pod 'SwiftyCodeView', :path => '/Users/artur/Desktop/Pod/SwiftyCodeView'
pod 'SwiftyCodeView'

end
12 changes: 6 additions & 6 deletions SwiftyCodeViewDemo/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ PODS:
- SwiftyCodeView (0.1.0)

DEPENDENCIES:
- SwiftyCodeView (from `/Users/artur/Desktop/Pod/SwiftyCodeView`)
- SwiftyCodeView

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

SPEC CHECKSUMS:
SwiftyCodeView: 3e4b6014f9ca3fbbe748defe41c06453186e0a99
SwiftyCodeView: 40bff9f5c5bd7b85e32cbc829fe9f42233f5cb73

PODFILE CHECKSUM: 9a36df8c88efaa4eab105b6f0bd689f5d3741cf7
PODFILE CHECKSUM: 6e513ded0496c9fc38b7677dc33c509fb7de5c02

COCOAPODS: 1.5.3
24 changes: 0 additions & 24 deletions SwiftyCodeViewDemo/Pods/Local Podspecs/SwiftyCodeView.podspec.json

This file was deleted.

12 changes: 6 additions & 6 deletions SwiftyCodeViewDemo/Pods/Manifest.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 5da2315

Please sign in to comment.