Created
July 18, 2019 08:50
-
-
Save AndreyAnt/f754b23794dcb714d3a7e583186a997b to your computer and use it in GitHub Desktop.
Attempt to create RxWay PincodeKeyboard
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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