DigitEntry in decent place.

This commit is contained in:
Kevin G Christiano 2019-11-19 09:57:43 -05:00
parent b9850bed81
commit c38e3c0712
2 changed files with 62 additions and 59 deletions

View File

@ -17,14 +17,10 @@ import UIKit
//-------------------------------------------------- //--------------------------------------------------
private(set) var numberOfDigits = 4 private(set) var numberOfDigits = 4
private var switchedAutomatically = false public var switchFieldsAutomatically = false
public var digitFields: [DigitBox] = [] public var digitFields: [DigitBox] = []
//--------------------------------------------------
// MARK: - Properties
//--------------------------------------------------
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Property Observers // MARK: - Property Observers
//-------------------------------------------------- //--------------------------------------------------
@ -133,12 +129,10 @@ import UIKit
alignCenterHorizontal() alignCenterHorizontal()
isAccessibilityElement = false isAccessibilityElement = false
entryContainer.hideBorder = true entryContainer.hideBorders = true
entryContainer.bottomBar.backgroundColor = UIColor.clear.cgColor entryContainer.bottomBar.backgroundColor = UIColor.clear.cgColor
entryContainer.bottomBar.frame = CGRect(x: 0, y: entryContainer.bounds.height, width: 0, height: 0) entryContainer.bottomBar.frame = CGRect(x: 0, y: entryContainer.bounds.height, width: 0, height: 0)
assembleDigitFieldsView(size: MVMCoreUISplitViewController.getDetailViewWidth()) assembleDigitFieldsView(size: MVMCoreUISplitViewController.getDetailViewWidth())
textField.removeFromSuperview()
} }
private func createDigitField() -> DigitBox { private func createDigitField() -> DigitBox {
@ -155,7 +149,11 @@ import UIKit
var accessibleElements: [Any] = [titleLabel] var accessibleElements: [Any] = [titleLabel]
if numberOfDigits > 0 { if numberOfDigits > 0 {
let digitFields = [DigitBox](repeating: createDigitField(), count: numberOfDigits) var digitFields = [DigitBox]()
for _ in 0..<numberOfDigits {
digitFields.append(createDigitField())
}
self.digitFields = digitFields self.digitFields = digitFields
guard let space = MFSizeObject(standardSize: 5, smalliPhoneSize: 3)?.getValueBasedOnScreenSize() else { return } guard let space = MFSizeObject(standardSize: 5, smalliPhoneSize: 3)?.getValueBasedOnScreenSize() else { return }
@ -195,6 +193,8 @@ import UIKit
open override func updateView(_ size: CGFloat) { open override func updateView(_ size: CGFloat) {
super.updateView(size) super.updateView(size)
entryContainer.hideBorders = true
DispatchQueue.main.async { [weak self] in DispatchQueue.main.async { [weak self] in
guard let self = self else { return } guard let self = self else { return }
@ -210,7 +210,7 @@ import UIKit
// MARK: - Methods // MARK: - Methods
//-------------------------------------------------- //--------------------------------------------------
func setAsSecureTextEntry(_ secureEntry: Bool) { public func setAsSecureTextEntry(_ secureEntry: Bool) {
DispatchQueue.main.async { [weak self] in DispatchQueue.main.async { [weak self] in
guard let self = self else { return } guard let self = self else { return }
@ -233,58 +233,54 @@ import UIKit
} }
} }
public func selectPreviousTextField(_ currentTextField: UITextField?, clear: Bool) { public func selectPreviousDigitField(_ currentTextField: UITextField?, clear: Bool) {
var selectNextField = false var selectNextField = false
for field in digitFields { for field in digitFields {
if field == currentTextField { if field.digitField == currentTextField {
selectNextField = true selectNextField = true
field.isSelected = false
} else if selectNextField { } else if selectNextField {
if !clear { if !clear {
switchedAutomatically = true switchFieldsAutomatically = true
} }
field.becomeFirstResponder() field.digitField.becomeFirstResponder()
switchedAutomatically = false field.isSelected = true
switchFieldsAutomatically = false
UIAccessibility.post(notification: .layoutChanged, argument: field) UIAccessibility.post(notification: .layoutChanged, argument: field.digitField)
} }
} }
} }
public func selectNextTextField(_ currentTextField: UITextField?, clear: Bool) { public func selectNextDigitField(_ currentTextField: UITextField?, clear: Bool) {
var selectNextField = false var selectNextField = false
for field in digitFields { for field in digitFields {
if field == currentTextField { if field.digitField == currentTextField {
selectNextField = true selectNextField = true
field.isSelected = false
} else if selectNextField { } else if selectNextField {
if !clear { if !clear {
switchedAutomatically = true switchFieldsAutomatically = true
} }
field.isSelected = true
field.becomeFirstResponder() field.becomeFirstResponder()
switchedAutomatically = false switchFieldsAutomatically = false
UIAccessibility.post(notification: .layoutChanged, argument: field) UIAccessibility.post(notification: .layoutChanged, argument: field.digitField)
} }
} }
} }
class func getEnabledTextfields(_ textFieldToDetermine: [TextEntryField]?) -> [AnyHashable]? { open class func getEnabledDigitFields(_ textFieldToDetermine: [TextEntryField]) -> [AnyHashable]? {
var enabledTextFields = [AnyHashable]() return textFieldToDetermine.filter { $0.isEnabled }
for textfield in textFieldToDetermine ?? [] {
if textfield.isEnabled {
enabledTextFields.append(textfield)
}
}
return enabledTextFields
} }
} }
@ -316,12 +312,12 @@ extension DigitEntryField {
// One character, switch old value with new, select next textfield // One character, switch old value with new, select next textfield
textField.text = string textField.text = string
selectNextTextField(textField, clear: false) selectNextDigitField(textField, clear: false)
valueChanged() valueChanged()
return false return false
} else if replacementLength == 0 && oldLength == 1 { } else if replacementLength == 0 && oldLength == 1 {
// non empty cell, clear and stay. // Non empty cell, clear and stay.
textField.text = "" textField.text = ""
valueChanged() valueChanged()
return false return false
@ -336,12 +332,12 @@ extension DigitEntryField {
func textFieldDidDelete(_ textField: UITextField?) { func textFieldDidDelete(_ textField: UITextField?) {
// Empty cell, go back to previous cell and clear. // Empty cell, go back to previous cell and clear.
selectPreviousTextField(textField, clear: true) selectPreviousDigitField(textField, clear: true)
} }
@objc public func textFieldDidBeginEditing(_ textField: UITextField) { @objc public func textFieldDidBeginEditing(_ textField: UITextField) {
if !switchedAutomatically { if !switchFieldsAutomatically {
textField.text = "" textField.text = ""
valueChanged() valueChanged()
} }
@ -356,7 +352,7 @@ extension DigitEntryField {
@objc public func textFieldShouldClear(_ textField: UITextField) -> Bool { @objc public func textFieldShouldClear(_ textField: UITextField) -> Bool {
selectPreviousTextField(textField, clear: false) selectPreviousDigitField(textField, clear: false)
return uiTextFieldDelegate?.textFieldShouldClear?(textField) ?? true return uiTextFieldDelegate?.textFieldShouldClear?(textField) ?? true
} }
@ -385,16 +381,16 @@ extension DigitEntryField {
numberOfDigits = digits numberOfDigits = digits
} }
assembleDigitFieldsView(size: MVMCoreUIUtility.getWidth())
if !dictionary.isEmpty{ if !dictionary.isEmpty{
for digitBox in digitFields { for digitBox in digitFields {
MVMCoreUICommonViewsUtility.addDismissToolbar(digitBox.digitField, delegate: delegateObject as? UITextFieldDelegate) MVMCoreUICommonViewsUtility.addDismissToolbar(digitBox.digitField, delegate: delegateObject as? UITextFieldDelegate)
} }
} }
assembleDigitFieldsView(size: MVMCoreUIUtility.getWidth())
} }
open override class func estimatedHeight(forRow json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { open override class func estimatedHeight(forRow json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {
return 44 return 115
} }
} }

View File

@ -24,7 +24,7 @@ import UIKit
}() }()
/// Determines if a border should be drawn. /// Determines if a border should be drawn.
public var hideBorder = false public var hideBorders = false
public var borderStrokeColor: UIColor = .mfSilver() public var borderStrokeColor: UIColor = .mfSilver()
private var borderPath: UIBezierPath = UIBezierPath() private var borderPath: UIBezierPath = UIBezierPath()
@ -35,13 +35,17 @@ import UIKit
public var showError = false { public var showError = false {
didSet { didSet {
showError ? errorUI() : originalUI() if !hideBorders {
showError ? errorUI() : originalUI()
}
} }
} }
public var isEnabled = true { public var isEnabled = true {
didSet { didSet {
isEnabled ? originalUI() : disabledUI() if !hideBorders {
isEnabled ? originalUI() : disabledUI()
}
} }
} }
@ -53,7 +57,9 @@ import UIKit
public var isSelected = false { public var isSelected = false {
didSet { didSet {
isSelected ? selectedUI() : originalUI() if !hideBorders {
isSelected ? selectedUI() : originalUI()
}
} }
} }
@ -86,7 +92,7 @@ import UIKit
borderPath.removeAllPoints() borderPath.removeAllPoints()
if !hideBorder { if !hideBorders {
// Brings the other half of the line inside the view to prevent cropping. // Brings the other half of the line inside the view to prevent cropping.
let origin = bounds.origin let origin = bounds.origin
let size = frame.size let size = frame.size
@ -117,7 +123,7 @@ import UIKit
open func originalUI() { open func originalUI() {
isUserInteractionEnabled = true isUserInteractionEnabled = true
hideBorder = false hideBorders = false
borderStrokeColor = .mfSilver() borderStrokeColor = .mfSilver()
bottomBar.backgroundColor = UIColor.black.cgColor bottomBar.backgroundColor = UIColor.black.cgColor
refreshUI(bottomBarSize: 1) refreshUI(bottomBarSize: 1)
@ -126,7 +132,7 @@ import UIKit
open func errorUI() { open func errorUI() {
isUserInteractionEnabled = true isUserInteractionEnabled = true
hideBorder = false hideBorders = false
borderStrokeColor = .mfPumpkin() borderStrokeColor = .mfPumpkin()
bottomBar.backgroundColor = UIColor.mfPumpkin().cgColor bottomBar.backgroundColor = UIColor.mfPumpkin().cgColor
refreshUI(bottomBarSize: 4) refreshUI(bottomBarSize: 4)
@ -135,7 +141,7 @@ import UIKit
open func selectedUI() { open func selectedUI() {
isUserInteractionEnabled = true isUserInteractionEnabled = true
hideBorder = false hideBorders = false
borderStrokeColor = .black borderStrokeColor = .black
bottomBar.backgroundColor = UIColor.black.cgColor bottomBar.backgroundColor = UIColor.black.cgColor
refreshUI(bottomBarSize: 1) refreshUI(bottomBarSize: 1)
@ -144,7 +150,7 @@ import UIKit
open func lockedUI() { open func lockedUI() {
isUserInteractionEnabled = false isUserInteractionEnabled = false
hideBorder = true hideBorders = true
borderStrokeColor = .clear borderStrokeColor = .clear
bottomBar.backgroundColor = UIColor.clear.cgColor bottomBar.backgroundColor = UIColor.clear.cgColor
refreshUI(bottomBarSize: 1) refreshUI(bottomBarSize: 1)
@ -154,19 +160,20 @@ import UIKit
isUserInteractionEnabled = false isUserInteractionEnabled = false
borderStrokeColor = .mfSilver() borderStrokeColor = .mfSilver()
hideBorder = false
bottomBar.backgroundColor = UIColor.mfSilver().cgColor bottomBar.backgroundColor = UIColor.mfSilver().cgColor
refreshUI(bottomBarSize: 1) refreshUI(bottomBarSize: 1)
} }
open func refreshUI(bottomBarSize: CGFloat? = nil) { open func refreshUI(bottomBarSize: CGFloat? = nil) {
let size: CGFloat = bottomBarSize ?? (showError ? 4 : 1) if !hideBorders {
bottomBar.frame = CGRect(x: 0, y: bounds.height - size, width: bounds.width, height: size) let size: CGFloat = bottomBarSize ?? (showError ? 4 : 1)
bottomBar.frame = CGRect(x: 0, y: bounds.height - size, width: bounds.width, height: size)
delegateObject?.moleculeDelegate?.moleculeLayoutUpdated?(self) delegateObject?.moleculeDelegate?.moleculeLayoutUpdated?(self)
setNeedsDisplay() setNeedsDisplay()
layoutIfNeeded() layoutIfNeeded()
}
} }
//-------------------------------------------------- //--------------------------------------------------
@ -179,8 +186,8 @@ import UIKit
guard let dictionary = json, !dictionary.isEmpty else { return } guard let dictionary = json, !dictionary.isEmpty else { return }
if let hideBorder = dictionary["hideBorder"] as? Bool { if let hideBorders = dictionary["hideBorders"] as? Bool {
self.hideBorder = hideBorder self.hideBorders = hideBorders
} }
} }
} }