Skip to content

Instantly share code, notes, and snippets.

@AndreyAnt
Created July 18, 2019 08:50
Show Gist options
  • Save AndreyAnt/f754b23794dcb714d3a7e583186a997b to your computer and use it in GitHub Desktop.
Save AndreyAnt/f754b23794dcb714d3a7e583186a997b to your computer and use it in GitHub Desktop.
Attempt to create RxWay PincodeKeyboard
import UIKit
import RxSwift
import RxCocoa
enum PincodeButtonValue {
case digit(value: Int)
case touchId
case backspace
}
class NewPincodeKeyboard: UIView {
private var buttonWidth: CGFloat { return 70.0 }
private var buttonOffset: CGFloat { return 30 }
private let disposeBag = DisposeBag()
private let buttons: Array<PincodeButton> = [
PincodeButton(value: .digit(value: 1)),
PincodeButton(value: .digit(value: 2)),
PincodeButton(value: .digit(value: 3)),
PincodeButton(value: .digit(value: 4)),
PincodeButton(value: .digit(value: 5)),
PincodeButton(value: .digit(value: 6)),
PincodeButton(value: .digit(value: 7)),
PincodeButton(value: .digit(value: 8)),
PincodeButton(value: .digit(value: 9)),
PincodeButton(value: .touchId),
PincodeButton(value: .digit(value: 0)),
PincodeButton(value: .backspace)
]
private let buttonPressed = PublishSubject<PincodeButtonValue>()
public lazy var valueEntered = buttonPressed.asObservable()
override init(frame: CGRect) {
super.init(frame: frame)
setupSubviews()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupSubviews()
}
private func setupSubviews() {
for button in buttons {
addSubview(button)
button.value
.asObservable()
.subscribe(onNext: { [unowned self] buttonValue in
self.buttonPressed.onNext(buttonValue)
}).disposed(by: disposeBag)
}
}
override func layoutSubviews() {
super.layoutSubviews()
let keyboardStartX = bounds.width/2 - buttonWidth*3/2 - buttonOffset
let keyboardStartY: CGFloat = 0
for (index, button) in buttons.enumerated() {
let item = CGFloat(index % 3)
let row = CGFloat(index / 3)
let buttonX = keyboardStartX + item*(buttonWidth + buttonOffset)
let buttonY = keyboardStartY + row*(buttonWidth + buttonOffset)
button.frame = CGRect(x: buttonX, y: buttonY, width: buttonWidth, height: buttonWidth)
}
}
}
class PincodeButton: UIButton {
private let _value: PincodeButtonValue
public let value = PublishSubject<PincodeButtonValue>()
private let disposeBag = DisposeBag()
init(value: PincodeButtonValue) {
self._value = value
super.init(frame: .zero)
bindTap()
}
required init?(coder aDecoder: NSCoder) {
self._value = .digit(value: 0)
super.init(coder: aDecoder)
bindTap()
}
private func bindTap() {
rx.tap.bind { [unowned self] _ in
self.value.onNext(self._value)
}.disposed(by: disposeBag)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment