wip.
This commit is contained in:
parent
8b5fe4a1f4
commit
64bda3cb1d
@ -35,7 +35,7 @@ import UIKit
|
|||||||
private var previousSize: CGFloat = 0.0
|
private var previousSize: CGFloat = 0.0
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Property Observer
|
// MARK: - Computed Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
public override var showError: Bool {
|
public override var showError: Bool {
|
||||||
|
|||||||
@ -13,36 +13,35 @@ import UIKit
|
|||||||
*/
|
*/
|
||||||
@objcMembers open class DigitEntryField: TextEntryField, DigitBoxProtocol {
|
@objcMembers open class DigitEntryField: TextEntryField, DigitBoxProtocol {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Properties
|
// MARK: - Stored Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
private(set) var numberOfDigits = 4
|
private(set) var numberOfDigits = 4
|
||||||
public var switchFieldsAutomatically = false
|
|
||||||
|
/// Monitors if fields are being selected internally.
|
||||||
|
private var switchFieldsAutomatically = false
|
||||||
|
|
||||||
public var digitBoxes: [DigitBox] = []
|
public var digitBoxes: [DigitBox] = []
|
||||||
var selectedDigitField: DigitBox?
|
var selectedDigitField: DigitBox?
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Property Observers
|
// MARK: - Computed Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
public override var isEnabled: Bool {
|
public override var isEnabled: Bool {
|
||||||
get { return super.isEnabled }
|
get { return super.isEnabled }
|
||||||
set (enabled) {
|
set (enabled) {
|
||||||
titleLabel.textColor = enabled ? .mfBattleshipGrey() : .mfSilver()
|
titleLabel.textColor = enabled ? .mfBattleshipGrey() : .mfSilver()
|
||||||
|
digitBoxes.forEach { $0.isEnabled = enabled }
|
||||||
digitBoxes.forEach {
|
super.isEnabled = enabled
|
||||||
$0.isEnabled = enabled
|
|
||||||
$0.isUserInteractionEnabled = enabled
|
|
||||||
$0.digitField.isEnabled = enabled
|
|
||||||
$0.digitField.textColor = enabled ? .black : .mfBattleshipGrey()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override var showError: Bool {
|
public override var showError: Bool {
|
||||||
didSet {
|
get { return super.showError }
|
||||||
digitBoxes.forEach { $0.showError = self.showError }
|
set (error) {
|
||||||
|
digitBoxes.forEach { $0.showError = error }
|
||||||
|
super.showError = error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,6 +49,7 @@ import UIKit
|
|||||||
get { return super.isLocked }
|
get { return super.isLocked }
|
||||||
set (locked) {
|
set (locked) {
|
||||||
digitBoxes.forEach { $0.isLocked = locked }
|
digitBoxes.forEach { $0.isLocked = locked }
|
||||||
|
super.isLocked = locked
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,6 +109,13 @@ import UIKit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Delegate
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
/// Holds a reference to the 'delegating' class so this class can internally influence the TextField behavior as well.
|
||||||
|
private weak var proprietorTextDelegate: UITextFieldDelegate?
|
||||||
|
|
||||||
/// If you're using a MFViewController, you must set this to it
|
/// If you're using a MFViewController, you must set this to it
|
||||||
public override weak var uiTextFieldDelegate: UITextFieldDelegate? {
|
public override weak var uiTextFieldDelegate: UITextFieldDelegate? {
|
||||||
get { return textField.delegate }
|
get { return textField.delegate }
|
||||||
@ -118,19 +125,15 @@ import UIKit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// MARK: - Delegate
|
|
||||||
//--------------------------------------------------
|
|
||||||
|
|
||||||
/// Holds a reference to the 'delegating' class so this class can internally influence the TextField behavior as well.
|
|
||||||
private weak var proprietorTextDelegate: UITextFieldDelegate?
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
@objc public override init(frame: CGRect) {
|
@objc public override init(frame: CGRect) {
|
||||||
super.init(frame: frame)
|
super.init(frame: frame)
|
||||||
|
|
||||||
|
isAccessibilityElement = false
|
||||||
|
entryContainer.disableAllBorders = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc public convenience init() {
|
@objc public convenience init() {
|
||||||
@ -152,12 +155,7 @@ import UIKit
|
|||||||
// MARK: - Setup
|
// MARK: - Setup
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
@objc public override func setupFieldContainerContent(_ container: UIView) {
|
@objc public override func setupFieldContainerContent(_ container: UIView) {}
|
||||||
|
|
||||||
alignCenterHorizontal()
|
|
||||||
isAccessibilityElement = false
|
|
||||||
entryContainer.disableAllBorders = true
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc private func createDigitField() -> DigitBox {
|
@objc private func createDigitField() -> DigitBox {
|
||||||
|
|
||||||
@ -173,10 +171,11 @@ import UIKit
|
|||||||
|
|
||||||
var accessibleElements: [Any] = [titleLabel]
|
var accessibleElements: [Any] = [titleLabel]
|
||||||
|
|
||||||
digitBoxes.forEach { $0.removeFromSuperview() }
|
resetDigitBoxes()
|
||||||
|
|
||||||
if numberOfDigits > 0 {
|
if numberOfDigits > 0 {
|
||||||
var digitBoxes = [DigitBox]()
|
var digitBoxes = [DigitBox]()
|
||||||
|
|
||||||
for _ in 0..<numberOfDigits {
|
for _ in 0..<numberOfDigits {
|
||||||
digitBoxes.append(createDigitField())
|
digitBoxes.append(createDigitField())
|
||||||
}
|
}
|
||||||
@ -206,8 +205,6 @@ import UIKit
|
|||||||
|
|
||||||
prevBox = box
|
prevBox = box
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
digitBoxes = []
|
|
||||||
}
|
}
|
||||||
|
|
||||||
accessibilityElements = accessibleElements + [feedbackLabel]
|
accessibilityElements = accessibleElements + [feedbackLabel]
|
||||||
@ -236,7 +233,13 @@ import UIKit
|
|||||||
@objc open override func reset() {
|
@objc open override func reset() {
|
||||||
super.reset()
|
super.reset()
|
||||||
|
|
||||||
|
resetDigitBoxes()
|
||||||
|
}
|
||||||
|
|
||||||
|
func resetDigitBoxes() {
|
||||||
|
|
||||||
digitBoxes.forEach { $0.reset() }
|
digitBoxes.forEach { $0.reset() }
|
||||||
|
digitBoxes = []
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -270,20 +273,22 @@ import UIKit
|
|||||||
|
|
||||||
var selectPreviousField = false
|
var selectPreviousField = false
|
||||||
|
|
||||||
for field in Array(digitBoxes.reversed()) {
|
for (index, field) in Array(digitBoxes.reversed()).enumerated() {
|
||||||
|
|
||||||
if field.isSelected {
|
if field.digitField == currentTextField {
|
||||||
selectPreviousField = true
|
|
||||||
field.isSelected = false
|
field.isSelected = false
|
||||||
|
if index == digitBoxes.count - 1 {
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
selectPreviousField = true
|
||||||
|
}
|
||||||
} else if selectPreviousField {
|
} else if selectPreviousField {
|
||||||
if !clear {
|
if !clear {
|
||||||
switchFieldsAutomatically = true
|
self.switchFieldsAutomatically = true
|
||||||
}
|
}
|
||||||
field.digitField.becomeFirstResponder()
|
field.digitField.becomeFirstResponder()
|
||||||
|
self.switchFieldsAutomatically = false
|
||||||
field.isSelected = true
|
field.isSelected = true
|
||||||
switchFieldsAutomatically = false
|
|
||||||
|
|
||||||
UIAccessibility.post(notification: .layoutChanged, argument: field.digitField)
|
UIAccessibility.post(notification: .layoutChanged, argument: field.digitField)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -295,8 +300,8 @@ import UIKit
|
|||||||
var selectNextField = false
|
var selectNextField = false
|
||||||
|
|
||||||
for (index, field) in digitBoxes.enumerated() {
|
for (index, field) in digitBoxes.enumerated() {
|
||||||
|
|
||||||
if field.isSelected {
|
if field.digitField == currentTextField {
|
||||||
if index == digitBoxes.count - 1 {
|
if index == digitBoxes.count - 1 {
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
@ -306,18 +311,17 @@ import UIKit
|
|||||||
|
|
||||||
} else if selectNextField {
|
} else if selectNextField {
|
||||||
if !clear {
|
if !clear {
|
||||||
switchFieldsAutomatically = true
|
self.switchFieldsAutomatically = true
|
||||||
}
|
}
|
||||||
field.digitField.becomeFirstResponder()
|
field.digitField.becomeFirstResponder()
|
||||||
|
self.switchFieldsAutomatically = false
|
||||||
field.isSelected = true
|
field.isSelected = true
|
||||||
switchFieldsAutomatically = false
|
|
||||||
|
|
||||||
UIAccessibility.post(notification: .layoutChanged, argument: field.digitField)
|
UIAccessibility.post(notification: .layoutChanged, argument: field.digitField)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc override func startEditing() {
|
@objc override func startEditing() {
|
||||||
|
|
||||||
selectedDigitField?.isSelected = true
|
selectedDigitField?.isSelected = true
|
||||||
@ -333,10 +337,10 @@ import UIKit
|
|||||||
|
|
||||||
@objc override func dismissFieldInput(_ sender: Any?) {
|
@objc override func dismissFieldInput(_ sender: Any?) {
|
||||||
|
|
||||||
for box in digitBoxes {
|
digitBoxes.forEach {
|
||||||
if box.isSelected {
|
if $0.isSelected {
|
||||||
box.digitField.resignFirstResponder()
|
$0.digitField.resignFirstResponder()
|
||||||
box.isSelected = false
|
$0.isSelected = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -394,12 +398,16 @@ extension DigitEntryField {
|
|||||||
|
|
||||||
@objc func digitFieldDidDelete(_ textField: UITextField?) {
|
@objc func digitFieldDidDelete(_ textField: UITextField?) {
|
||||||
|
|
||||||
// Empty cell, go back to previous cell and clear.
|
|
||||||
selectPreviousDigitField(textField, clear: true)
|
selectPreviousDigitField(textField, clear: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc public func textFieldDidBeginEditing(_ textField: UITextField) {
|
@objc public func textFieldDidBeginEditing(_ textField: UITextField) {
|
||||||
|
|
||||||
|
if !switchFieldsAutomatically {
|
||||||
|
textField.text = ""
|
||||||
|
valueChanged()
|
||||||
|
}
|
||||||
|
|
||||||
for digitBox in digitBoxes {
|
for digitBox in digitBoxes {
|
||||||
|
|
||||||
if digitBox.isSelected {
|
if digitBox.isSelected {
|
||||||
@ -413,11 +421,6 @@ extension DigitEntryField {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if !switchFieldsAutomatically {
|
|
||||||
// textField.text = ""
|
|
||||||
// valueChanged()
|
|
||||||
// }
|
|
||||||
|
|
||||||
proprietorTextDelegate?.textFieldDidBeginEditing?(textField)
|
proprietorTextDelegate?.textFieldDidBeginEditing?(textField)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,7 +429,7 @@ extension DigitEntryField {
|
|||||||
digitBoxes.forEach { box in
|
digitBoxes.forEach { box in
|
||||||
if box.digitField == textField {
|
if box.digitField == textField {
|
||||||
box.isSelected = false
|
box.isSelected = false
|
||||||
break
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user