Merge branch 'mbruce/fields-refactor' into 'develop'
refactored EntryFields See merge request BPHV_MIPS/vds_ios!258
This commit is contained in:
commit
b3bd15b3ee
@ -101,15 +101,11 @@ open class DatePicker: EntryFieldBase, DatePickerViewControllerDelegate, UIPopov
|
|||||||
open override func setup() {
|
open override func setup() {
|
||||||
super.setup()
|
super.setup()
|
||||||
|
|
||||||
fieldStackView.isAccessibilityElement = true
|
|
||||||
fieldStackView.accessibilityLabel = "Date Picker"
|
|
||||||
fieldStackView.accessibilityHint = "Double Tap to open"
|
|
||||||
|
|
||||||
// setting color config
|
// setting color config
|
||||||
selectedDateLabel.textColorConfiguration = primaryColorConfiguration.eraseToAnyColorable()
|
selectedDateLabel.textColorConfiguration = primaryColorConfiguration.eraseToAnyColorable()
|
||||||
|
|
||||||
// tap gesture
|
// tap gesture
|
||||||
fieldStackView
|
containerView
|
||||||
.publisher(for: UITapGestureRecognizer())
|
.publisher(for: UITapGestureRecognizer())
|
||||||
.sink { [weak self] _ in
|
.sink { [weak self] _ in
|
||||||
guard let self else { return }
|
guard let self else { return }
|
||||||
@ -144,14 +140,7 @@ open class DatePicker: EntryFieldBase, DatePickerViewControllerDelegate, UIPopov
|
|||||||
selectedDateLabel.isEnabled = isEnabled
|
selectedDateLabel.isEnabled = isEnabled
|
||||||
calendarIcon.color = iconColorConfiguration.getColor(self)
|
calendarIcon.color = iconColorConfiguration.getColor(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func updateAccessibility() {
|
|
||||||
super.updateAccessibility()
|
|
||||||
fieldStackView.accessibilityLabel = "Date Picker, \(accessibilityLabelText)"
|
|
||||||
fieldStackView.accessibilityHint = isReadOnly || !isEnabled ? "" : "Double tap to open."
|
|
||||||
fieldStackView.accessibilityValue = value
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Resets to default settings.
|
/// Resets to default settings.
|
||||||
open override func reset() {
|
open override func reset() {
|
||||||
super.reset()
|
super.reset()
|
||||||
@ -184,7 +173,7 @@ open class DatePicker: EntryFieldBase, DatePickerViewControllerDelegate, UIPopov
|
|||||||
controller.dismiss(animated: true) { [weak self] in
|
controller.dismiss(animated: true) { [weak self] in
|
||||||
guard let self else { return }
|
guard let self else { return }
|
||||||
self.sendActions(for: .valueChanged)
|
self.sendActions(for: .valueChanged)
|
||||||
UIAccessibility.post(notification: .layoutChanged, argument: self.fieldStackView)
|
UIAccessibility.post(notification: .layoutChanged, argument: self.containerView)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -66,6 +66,8 @@ open class DropdownSelect: EntryFieldBase {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Private Properties
|
// MARK: - Private Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
internal override var responder: UIResponder? { dropdownField }
|
||||||
|
|
||||||
internal var minWidthDefault = 66.0
|
internal var minWidthDefault = 66.0
|
||||||
internal var minWidthInlineLabel = 102.0
|
internal var minWidthInlineLabel = 102.0
|
||||||
internal override var minWidth: CGFloat { showInlineLabel ? minWidthInlineLabel : minWidthDefault }
|
internal override var minWidth: CGFloat { showInlineLabel ? minWidthInlineLabel : minWidthDefault }
|
||||||
@ -131,7 +133,6 @@ open class DropdownSelect: EntryFieldBase {
|
|||||||
open override func setup() {
|
open override func setup() {
|
||||||
super.setup()
|
super.setup()
|
||||||
|
|
||||||
fieldStackView.isAccessibilityElement = true
|
|
||||||
inlineDisplayLabel.isAccessibilityElement = true
|
inlineDisplayLabel.isAccessibilityElement = true
|
||||||
|
|
||||||
dropdownField.width(0)
|
dropdownField.width(0)
|
||||||
@ -276,57 +277,11 @@ open class DropdownSelect: EntryFieldBase {
|
|||||||
statusIcon.color = iconColorConfiguration.getColor(self)
|
statusIcon.color = iconColorConfiguration.getColor(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func updateAccessibility() {
|
|
||||||
super.updateAccessibility()
|
|
||||||
fieldStackView.accessibilityLabel = "Dropdown Select, \(accessibilityLabelText)"
|
|
||||||
fieldStackView.accessibilityHint = isReadOnly || !isEnabled ? "" : "has popup, Double tap to open."
|
|
||||||
fieldStackView.accessibilityValue = value
|
|
||||||
}
|
|
||||||
|
|
||||||
open override var accessibilityElements: [Any]? {
|
|
||||||
get {
|
|
||||||
var elements = [Any]()
|
|
||||||
elements.append(contentsOf: [titleLabel, fieldStackView])
|
|
||||||
|
|
||||||
if showError {
|
|
||||||
elements.append(statusIcon)
|
|
||||||
if let errorText, !errorText.isEmpty {
|
|
||||||
elements.append(errorLabel)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let helperText, !helperText.isEmpty {
|
|
||||||
elements.append(helperLabel)
|
|
||||||
}
|
|
||||||
|
|
||||||
return elements
|
|
||||||
}
|
|
||||||
|
|
||||||
set { super.accessibilityElements = newValue }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@objc open func pickerDoneClicked() {
|
@objc open func pickerDoneClicked() {
|
||||||
optionsPicker.isHidden = true
|
optionsPicker.isHidden = true
|
||||||
dropdownField.resignFirstResponder()
|
dropdownField.resignFirstResponder()
|
||||||
setNeedsUpdate()
|
setNeedsUpdate()
|
||||||
UIAccessibility.post(notification: .layoutChanged, argument: fieldStackView)
|
UIAccessibility.post(notification: .layoutChanged, argument: containerView)
|
||||||
}
|
|
||||||
|
|
||||||
open override var canBecomeFirstResponder: Bool {
|
|
||||||
return dropdownField.canBecomeFirstResponder
|
|
||||||
}
|
|
||||||
|
|
||||||
open override func becomeFirstResponder() -> Bool {
|
|
||||||
return dropdownField.becomeFirstResponder()
|
|
||||||
}
|
|
||||||
|
|
||||||
open override var canResignFirstResponder: Bool {
|
|
||||||
return dropdownField.canResignFirstResponder
|
|
||||||
}
|
|
||||||
|
|
||||||
open override func resignFirstResponder() -> Bool {
|
|
||||||
return dropdownField.resignFirstResponder()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,8 +292,8 @@ extension DropdownSelect: UIPickerViewDelegate, UIPickerViewDataSource {
|
|||||||
|
|
||||||
internal func launchPicker() {
|
internal func launchPicker() {
|
||||||
if optionsPicker.isHidden {
|
if optionsPicker.isHidden {
|
||||||
UIAccessibility.post(notification: .layoutChanged, argument: optionsPicker)
|
|
||||||
dropdownField.becomeFirstResponder()
|
dropdownField.becomeFirstResponder()
|
||||||
|
UIAccessibility.post(notification: .layoutChanged, argument: optionsPicker)
|
||||||
} else {
|
} else {
|
||||||
dropdownField.resignFirstResponder()
|
dropdownField.resignFirstResponder()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,6 +40,8 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Private Properties
|
// MARK: - Private Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
internal var responder: UIResponder? { return nil }
|
||||||
|
|
||||||
internal let mainStackView = UIStackView().with {
|
internal let mainStackView = UIStackView().with {
|
||||||
$0.axis = .vertical
|
$0.axis = .vertical
|
||||||
$0.alignment = .fill
|
$0.alignment = .fill
|
||||||
@ -95,6 +97,7 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable {
|
|||||||
internal var containerView: UIView = {
|
internal var containerView: UIView = {
|
||||||
return UIView().with {
|
return UIView().with {
|
||||||
$0.translatesAutoresizingMaskIntoConstraints = false
|
$0.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
$0.isAccessibilityElement = true
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@ -243,7 +246,8 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable {
|
|||||||
|
|
||||||
open var accessibilityLabelText: String {
|
open var accessibilityLabelText: String {
|
||||||
var accessibilityLabels = [String]()
|
var accessibilityLabels = [String]()
|
||||||
if let text = titleLabel.text {
|
|
||||||
|
if let text = titleLabel.text?.trimmingCharacters(in: .whitespaces) {
|
||||||
accessibilityLabels.append(text)
|
accessibilityLabels.append(text)
|
||||||
}
|
}
|
||||||
if isReadOnly {
|
if isReadOnly {
|
||||||
@ -255,9 +259,14 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable {
|
|||||||
if let errorText, showError {
|
if let errorText, showError {
|
||||||
accessibilityLabels.append("error, \(errorText)")
|
accessibilityLabels.append("error, \(errorText)")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
accessibilityLabels.append("\(Self.self)")
|
||||||
|
|
||||||
return accessibilityLabels.joined(separator: ", ")
|
return accessibilityLabels.joined(separator: ", ")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open var accessibilityHintText: String = "Double tap to open"
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Overrides
|
// MARK: - Overrides
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -360,6 +369,22 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable {
|
|||||||
isReadOnly = false
|
isReadOnly = false
|
||||||
onChange = nil
|
onChange = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open override var canBecomeFirstResponder: Bool {
|
||||||
|
responder?.canBecomeFirstResponder ?? super.canBecomeFirstResponder
|
||||||
|
}
|
||||||
|
|
||||||
|
open override func becomeFirstResponder() -> Bool {
|
||||||
|
responder?.becomeFirstResponder() ?? super.becomeFirstResponder()
|
||||||
|
}
|
||||||
|
|
||||||
|
open override var canResignFirstResponder: Bool {
|
||||||
|
responder?.canResignFirstResponder ?? super.canResignFirstResponder
|
||||||
|
}
|
||||||
|
|
||||||
|
open override func resignFirstResponder() -> Bool {
|
||||||
|
responder?.resignFirstResponder() ?? super.resignFirstResponder()
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Methods
|
// MARK: - Public Methods
|
||||||
@ -447,6 +472,35 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open override func updateAccessibility() {
|
||||||
|
super.updateAccessibility()
|
||||||
|
containerView.accessibilityLabel = accessibilityLabelText
|
||||||
|
containerView.accessibilityHint = isReadOnly || !isEnabled ? "" : accessibilityHintText
|
||||||
|
containerView.accessibilityValue = value
|
||||||
|
}
|
||||||
|
|
||||||
|
open override var accessibilityElements: [Any]? {
|
||||||
|
get {
|
||||||
|
var elements = [Any]()
|
||||||
|
elements.append(contentsOf: [titleLabel, containerView])
|
||||||
|
|
||||||
|
if showError {
|
||||||
|
elements.append(statusIcon)
|
||||||
|
if let errorText, !errorText.isEmpty {
|
||||||
|
elements.append(errorLabel)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let helperText, !helperText.isEmpty {
|
||||||
|
elements.append(helperLabel)
|
||||||
|
}
|
||||||
|
|
||||||
|
return elements
|
||||||
|
}
|
||||||
|
|
||||||
|
set { super.accessibilityElements = newValue }
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Private Methods
|
// MARK: - Private Methods
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -34,6 +34,8 @@ open class InputField: EntryFieldBase {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Private Properties
|
// MARK: - Private Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
internal override var responder: UIResponder? { textField }
|
||||||
|
|
||||||
internal override var containerBackgroundColor: UIColor {
|
internal override var containerBackgroundColor: UIColor {
|
||||||
if showSuccess {
|
if showSuccess {
|
||||||
return backgroundColorConfiguration.getColor(self)
|
return backgroundColorConfiguration.getColor(self)
|
||||||
@ -102,6 +104,7 @@ open class InputField: EntryFieldBase {
|
|||||||
open var textField = TextField().with {
|
open var textField = TextField().with {
|
||||||
$0.translatesAutoresizingMaskIntoConstraints = false
|
$0.translatesAutoresizingMaskIntoConstraints = false
|
||||||
$0.textStyle = TextStyle.bodyLarge
|
$0.textStyle = TextStyle.bodyLarge
|
||||||
|
$0.isAccessibilityElement = false
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color configuration for the textField.
|
/// Color configuration for the textField.
|
||||||
@ -181,6 +184,8 @@ open class InputField: EntryFieldBase {
|
|||||||
/// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations.
|
/// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations.
|
||||||
open override func setup() {
|
open override func setup() {
|
||||||
super.setup()
|
super.setup()
|
||||||
|
accessibilityHintText = "Double tap to edit"
|
||||||
|
|
||||||
textField.heightAnchor.constraint(equalToConstant: 20).isActive = true
|
textField.heightAnchor.constraint(equalToConstant: 20).isActive = true
|
||||||
textField.delegate = self
|
textField.delegate = self
|
||||||
bottomContainerStackView.insertArrangedSubview(successLabel, at: 0)
|
bottomContainerStackView.insertArrangedSubview(successLabel, at: 0)
|
||||||
@ -227,13 +232,7 @@ open class InputField: EntryFieldBase {
|
|||||||
textField.isEnabled = isEnabled
|
textField.isEnabled = isEnabled
|
||||||
textField.isUserInteractionEnabled = isEnabled && !isReadOnly
|
textField.isUserInteractionEnabled = isEnabled && !isReadOnly
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func updateAccessibility() {
|
|
||||||
super.updateAccessibility()
|
|
||||||
textField.accessibilityLabel = accessibilityLabelText
|
|
||||||
textField.accessibilityHint = isReadOnly || !isEnabled ? "" : "Double tap to open."
|
|
||||||
}
|
|
||||||
|
|
||||||
open override func updateErrorLabel() {
|
open override func updateErrorLabel() {
|
||||||
super.updateErrorLabel()
|
super.updateErrorLabel()
|
||||||
|
|
||||||
@ -264,7 +263,7 @@ open class InputField: EntryFieldBase {
|
|||||||
open override var accessibilityElements: [Any]? {
|
open override var accessibilityElements: [Any]? {
|
||||||
get {
|
get {
|
||||||
var elements = [Any]()
|
var elements = [Any]()
|
||||||
elements.append(contentsOf: [titleLabel, textField])
|
elements.append(contentsOf: [titleLabel, containerView])
|
||||||
if showError {
|
if showError {
|
||||||
elements.append(statusIcon)
|
elements.append(statusIcon)
|
||||||
if let errorText, !errorText.isEmpty {
|
if let errorText, !errorText.isEmpty {
|
||||||
@ -283,22 +282,6 @@ open class InputField: EntryFieldBase {
|
|||||||
|
|
||||||
set { super.accessibilityElements = newValue }
|
set { super.accessibilityElements = newValue }
|
||||||
}
|
}
|
||||||
|
|
||||||
open override var canBecomeFirstResponder: Bool {
|
|
||||||
return textField.canBecomeFirstResponder
|
|
||||||
}
|
|
||||||
|
|
||||||
open override func becomeFirstResponder() -> Bool {
|
|
||||||
return textField.becomeFirstResponder()
|
|
||||||
}
|
|
||||||
|
|
||||||
open override var canResignFirstResponder: Bool {
|
|
||||||
return textField.canResignFirstResponder
|
|
||||||
}
|
|
||||||
|
|
||||||
open override func resignFirstResponder() -> Bool {
|
|
||||||
return textField.resignFirstResponder()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension InputField: UITextFieldDelegate {
|
extension InputField: UITextFieldDelegate {
|
||||||
@ -311,6 +294,7 @@ extension InputField: UITextFieldDelegate {
|
|||||||
public func textFieldDidEndEditing(_ textField: UITextField) {
|
public func textFieldDidEndEditing(_ textField: UITextField) {
|
||||||
fieldType.handler().textFieldDidEndEditing(self, textField: textField)
|
fieldType.handler().textFieldDidEndEditing(self, textField: textField)
|
||||||
validate()
|
validate()
|
||||||
|
UIAccessibility.post(notification: .layoutChanged, argument: self.containerView)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func textFieldDidChangeSelection(_ textField: UITextField) {
|
public func textFieldDidChangeSelection(_ textField: UITextField) {
|
||||||
|
|||||||
@ -32,6 +32,8 @@ open class TextArea: EntryFieldBase {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Private Properties
|
// MARK: - Private Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
internal override var responder: UIResponder? { textView }
|
||||||
|
|
||||||
internal var textViewHeightConstraint: NSLayoutConstraint?
|
internal var textViewHeightConstraint: NSLayoutConstraint?
|
||||||
|
|
||||||
internal var inputFieldStackView: UIStackView = {
|
internal var inputFieldStackView: UIStackView = {
|
||||||
@ -42,14 +44,14 @@ open class TextArea: EntryFieldBase {
|
|||||||
$0.spacing = VDSLayout.space3X
|
$0.spacing = VDSLayout.space3X
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
open var characterCounterLabel = Label().with {
|
open var characterCounterLabel = Label().with {
|
||||||
$0.setContentCompressionResistancePriority(.required, for: .vertical)
|
$0.setContentCompressionResistancePriority(.required, for: .vertical)
|
||||||
$0.textStyle = .bodySmall
|
$0.textStyle = .bodySmall
|
||||||
$0.textAlignment = .right
|
$0.textAlignment = .right
|
||||||
$0.numberOfLines = 1
|
$0.numberOfLines = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
open var minHeight: Height = .twoX { didSet { setNeedsUpdate() } }
|
open var minHeight: Height = .twoX { didSet { setNeedsUpdate() } }
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -101,13 +103,15 @@ open class TextArea: EntryFieldBase {
|
|||||||
open override var value: String? {
|
open override var value: String? {
|
||||||
return textView.text
|
return textView.text
|
||||||
}
|
}
|
||||||
|
|
||||||
/// UITextView shown in the TextArea.
|
/// UITextView shown in the TextArea.
|
||||||
open var textView = TextView().with {
|
open var textView = TextView().with {
|
||||||
$0.translatesAutoresizingMaskIntoConstraints = false
|
$0.translatesAutoresizingMaskIntoConstraints = false
|
||||||
$0.sizeToFit()
|
$0.sizeToFit()
|
||||||
$0.isScrollEnabled = false
|
$0.isAccessibilityElement = false
|
||||||
|
$0.isScrollEnabled = true
|
||||||
$0.textContainerInset = .zero
|
$0.textContainerInset = .zero
|
||||||
|
$0.autocorrectionType = .no
|
||||||
$0.textContainer.lineFragmentPadding = 0
|
$0.textContainer.lineFragmentPadding = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,10 +141,8 @@ open class TextArea: EntryFieldBase {
|
|||||||
/// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations.
|
/// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations.
|
||||||
open override func setup() {
|
open override func setup() {
|
||||||
super.setup()
|
super.setup()
|
||||||
fieldStackView.pinToSuperView(.uniform(VDSFormControls.spaceInset))
|
|
||||||
|
accessibilityHintText = "Double tap to edit"
|
||||||
textView.isScrollEnabled = true
|
|
||||||
textView.autocorrectionType = .no
|
|
||||||
|
|
||||||
//events
|
//events
|
||||||
textView
|
textView
|
||||||
@ -159,6 +161,7 @@ open class TextArea: EntryFieldBase {
|
|||||||
.publisher(for: .editingDidEnd)
|
.publisher(for: .editingDidEnd)
|
||||||
.sink { [weak self] _ in
|
.sink { [weak self] _ in
|
||||||
self?.validate()
|
self?.validate()
|
||||||
|
UIAccessibility.post(notification: .layoutChanged, argument: self?.containerView)
|
||||||
}.store(in: &subscribers)
|
}.store(in: &subscribers)
|
||||||
|
|
||||||
textViewHeightConstraint = textView.heightAnchor.constraint(greaterThanOrEqualToConstant: containerSize.height)
|
textViewHeightConstraint = textView.heightAnchor.constraint(greaterThanOrEqualToConstant: containerSize.height)
|
||||||
@ -192,13 +195,7 @@ open class TextArea: EntryFieldBase {
|
|||||||
characterCounterLabel.surface = surface
|
characterCounterLabel.surface = surface
|
||||||
highlightCharacterOverflow()
|
highlightCharacterOverflow()
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func updateAccessibility() {
|
|
||||||
super.updateAccessibility()
|
|
||||||
textView.accessibilityLabel = accessibilityLabelText
|
|
||||||
textView.accessibilityHint = isReadOnly || !isEnabled ? "" : "Double tap to open."
|
|
||||||
}
|
|
||||||
|
|
||||||
override func updateRules() {
|
override func updateRules() {
|
||||||
super.updateRules()
|
super.updateRules()
|
||||||
|
|
||||||
@ -222,46 +219,7 @@ open class TextArea: EntryFieldBase {
|
|||||||
stackView.addArrangedSubview(characterCounterLabel)
|
stackView.addArrangedSubview(characterCounterLabel)
|
||||||
return stackView
|
return stackView
|
||||||
}
|
}
|
||||||
|
|
||||||
open override var accessibilityElements: [Any]? {
|
|
||||||
get {
|
|
||||||
var elements = [Any]()
|
|
||||||
elements.append(contentsOf: [titleLabel, textView])
|
|
||||||
|
|
||||||
if showError {
|
|
||||||
elements.append(statusIcon)
|
|
||||||
if let errorText, !errorText.isEmpty {
|
|
||||||
elements.append(errorLabel)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let helperText, !helperText.isEmpty {
|
|
||||||
elements.append(helperLabel)
|
|
||||||
}
|
|
||||||
|
|
||||||
return elements
|
|
||||||
}
|
|
||||||
|
|
||||||
set { super.accessibilityElements = newValue }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
open override var canBecomeFirstResponder: Bool {
|
|
||||||
return textView.canBecomeFirstResponder
|
|
||||||
}
|
|
||||||
|
|
||||||
open override func becomeFirstResponder() -> Bool {
|
|
||||||
return textView.becomeFirstResponder()
|
|
||||||
}
|
|
||||||
|
|
||||||
open override var canResignFirstResponder: Bool {
|
|
||||||
return textView.canResignFirstResponder
|
|
||||||
}
|
|
||||||
|
|
||||||
open override func resignFirstResponder() -> Bool {
|
|
||||||
return textView.resignFirstResponder()
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Private Methods
|
// MARK: - Private Methods
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "discover.svg",
|
"filename" : "Discover-02.svg",
|
||||||
"idiom" : "universal"
|
"idiom" : "universal"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
1
VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Discover-02.svg
vendored
Normal file
1
VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Discover-02.svg
vendored
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 19 KiB |
@ -1,49 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 20">
|
|
||||||
<g>
|
|
||||||
<path fill="#231F20" d="M1.447,7.449H0v5.067h1.447c0.763,0,1.324-0.184,1.806-0.587c0.579-0.482,0.921-1.201,0.921-1.946
|
|
||||||
C4.164,8.492,3.051,7.449,1.447,7.449z M2.604,11.254c-0.307,0.281-0.71,0.403-1.35,0.403H0.991V8.308h0.263
|
|
||||||
c0.64,0,1.026,0.114,1.35,0.412c0.342,0.307,0.544,0.772,0.544,1.262C3.147,10.465,2.946,10.947,2.604,11.254z"/>
|
|
||||||
<rect id="XMLID_422_" x="4.62" y="7.449" fill="#231F20" width="0.991" height="5.067"/>
|
|
||||||
<path id="XMLID_421_" fill="#231F20" d="M8.022,9.395c-0.596-0.219-0.763-0.368-0.763-0.64c0-0.316,0.307-0.561,0.736-0.561
|
|
||||||
c0.298,0,0.535,0.123,0.798,0.412l0.517-0.675C8.89,7.563,8.381,7.37,7.82,7.37c-0.894,0-1.578,0.622-1.578,1.447
|
|
||||||
c0,0.701,0.316,1.052,1.245,1.385c0.386,0.14,0.587,0.228,0.684,0.289c0.202,0.132,0.298,0.316,0.298,0.526
|
|
||||||
c0,0.412-0.324,0.71-0.763,0.71c-0.473,0-0.85-0.237-1.078-0.675l-0.64,0.614c0.456,0.666,0.999,0.964,1.753,0.964
|
|
||||||
c1.026,0,1.745-0.684,1.745-1.666C9.486,10.167,9.153,9.807,8.022,9.395z"/>
|
|
||||||
<path id="XMLID_420_" fill="#231F20" d="M9.793,9.982c0,1.49,1.166,2.639,2.674,2.639c0.421,0,0.789-0.088,1.236-0.298v-1.166
|
|
||||||
c-0.395,0.395-0.745,0.552-1.192,0.552c-0.991,0-1.701-0.719-1.701-1.745c0-0.973,0.728-1.736,1.657-1.736
|
|
||||||
c0.473,0,0.824,0.167,1.236,0.57V7.633c-0.43-0.219-0.789-0.307-1.219-0.307C10.994,7.335,9.793,8.51,9.793,9.982z"/>
|
|
||||||
<polygon id="XMLID_419_" fill="#231F20" points="21.532,10.85 20.182,7.449 19.104,7.449 21.26,12.648 21.786,12.648 23.978,7.449
|
|
||||||
22.908,7.449 "/>
|
|
||||||
<polygon id="XMLID_418_" fill="#231F20" points="24.425,12.516 27.222,12.516 27.222,11.657 25.407,11.657 25.407,10.289
|
|
||||||
27.152,10.289 27.152,9.43 25.407,9.43 25.407,8.308 27.222,8.308 27.222,7.449 24.425,7.449 "/>
|
|
||||||
<path fill="#231F20" d="M31.132,8.948c0-0.947-0.649-1.499-1.788-1.499h-1.464v5.067h0.991v-2.034h0.132l1.368,2.034h1.219
|
|
||||||
l-1.596-2.13C30.72,10.228,31.132,9.719,31.132,8.948z M29.151,9.781h-0.289V8.247h0.307c0.614,0,0.947,0.254,0.947,0.754
|
|
||||||
C30.115,9.509,29.782,9.781,29.151,9.781z"/>
|
|
||||||
|
|
||||||
<linearGradient id="XMLID_2_" gradientUnits="userSpaceOnUse" x1="18.0982" y1="592.1596" x2="16.2331" y2="589.2393" gradientTransform="matrix(1 0 0 1 0 -580)">
|
|
||||||
<stop offset="0" stop-color="#F89F20"/>
|
|
||||||
<stop offset="0.2502" stop-color="#F79A20"/>
|
|
||||||
<stop offset="0.5331" stop-color="#F68D20"/>
|
|
||||||
<stop offset="0.6196" stop-color="#F58720"/>
|
|
||||||
<stop offset="0.7232" stop-color="#F48120"/>
|
|
||||||
<stop offset="1" stop-color="#F37521"/>
|
|
||||||
</linearGradient>
|
|
||||||
<circle id="XMLID_415_" fill="url(#XMLID_2_)" cx="16.719" cy="10" r="2.692"/>
|
|
||||||
|
|
||||||
<linearGradient id="XMLID_3_" gradientUnits="userSpaceOnUse" x1="17.8034" y1="592.1198" x2="15.0775" y2="586.7917" gradientTransform="matrix(1 0 0 1 0 -580)">
|
|
||||||
<stop offset="0" stop-color="#F58720"/>
|
|
||||||
<stop offset="0.3587" stop-color="#E16F27"/>
|
|
||||||
<stop offset="0.703" stop-color="#D4602C"/>
|
|
||||||
<stop offset="0.9816" stop-color="#D05B2E"/>
|
|
||||||
</linearGradient>
|
|
||||||
<circle id="XMLID_414_" opacity="0.65" fill="url(#XMLID_3_)" cx="16.719" cy="10" r="2.692"/>
|
|
||||||
<g id="XMLID_430_">
|
|
||||||
<path fill="#231F20" d="M31.763,7.642c0-0.088-0.061-0.14-0.167-0.14h-0.14v0.447h0.105V7.773l0.123,0.175h0.132l-0.149-0.184
|
|
||||||
C31.728,7.747,31.763,7.703,31.763,7.642z M31.579,7.703h-0.018V7.589h0.018c0.053,0,0.079,0.018,0.079,0.061
|
|
||||||
C31.658,7.685,31.632,7.703,31.579,7.703z"/>
|
|
||||||
<path fill="#231F20" d="M31.614,7.335c-0.219,0-0.386,0.175-0.386,0.386c0,0.219,0.175,0.386,0.386,0.386
|
|
||||||
c0.21,0,0.386-0.175,0.386-0.386C32,7.51,31.825,7.335,31.614,7.335z M31.614,8.045c-0.167,0-0.307-0.14-0.307-0.316
|
|
||||||
c0-0.175,0.14-0.316,0.307-0.316c0.167,0,0.307,0.149,0.307,0.316C31.921,7.905,31.781,8.045,31.614,8.045z"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.6 KiB |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "jcb.svg",
|
"filename" : "jcb-emblem-logo.svg",
|
||||||
"idiom" : "universal"
|
"idiom" : "universal"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
1
VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb-emblem-logo.svg
vendored
Normal file
1
VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb-emblem-logo.svg
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?><svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34 26.19"><path d="M34,20.91c0,2.91-2.37,5.28-5.28,5.28H0V5.28C0,2.37,2.37,0,5.28,0h28.72V20.91Z" fill="#fff"/><path d="M24.65,15.55h2.18l.27-.02c.42-.08,.77-.46,.77-.98s-.35-.87-.77-.98l-.27-.02h-2.18v2Z" fill="#469b23"/><path d="M26.58,1.77c-2.08,0-3.78,1.68-3.78,3.78v3.93h5.34c.12,0,.27,0,.37,.02,1.21,.06,2.1,.69,2.1,1.77,0,.85-.6,1.58-1.72,1.72v.04c1.23,.08,2.16,.77,2.16,1.83,0,1.14-1.04,1.89-2.41,1.89h-5.86v7.69h5.55c2.08,0,3.78-1.68,3.78-3.78V1.77h-5.53Z" fill="#469b23"/><path d="M27.6,11.51c0-.5-.35-.83-.77-.89l-.21-.02h-1.97v1.83h1.97l.21-.02c.42-.06,.77-.39,.77-.89Z" fill="#469b23"/><path d="M5.67,1.77c-2.08,0-3.78,1.68-3.78,3.78V14.88c1.06,.52,2.16,.85,3.26,.85,1.31,0,2.02-.79,2.02-1.87v-4.41h3.24v4.39c0,1.7-1.06,3.1-4.66,3.1-2.18,0-3.89-.48-3.89-.48v7.96H7.42c2.08,0,3.78-1.68,3.78-3.78V1.77H5.67Z" fill="#0c2c84"/><path d="M16.13,1.77c-2.08,0-3.78,1.68-3.78,3.78v4.95c.96-.81,2.62-1.33,5.3-1.21,1.43,.06,2.97,.46,2.97,.46v1.6c-.77-.39-1.68-.75-2.87-.83-2.04-.15-3.26,.85-3.26,2.6s1.23,2.76,3.26,2.6c1.18-.08,2.1-.46,2.87-.83v1.6s-1.52,.39-2.97,.46c-2.68,.12-4.34-.39-5.3-1.21v8.73h5.55c2.08,0,3.78-1.68,3.78-3.78V1.77h-5.55Z" fill="#d7182a"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
@ -1,51 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 20">
|
|
||||||
<g>
|
|
||||||
|
|
||||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-856.4599" y1="503.2267" x2="-855.8029" y2="503.2267" gradientTransform="matrix(12.5258 0 0 -12.5258 10748.9648 6314.5825)">
|
|
||||||
<stop offset="0" stop-color="#007940"/>
|
|
||||||
<stop offset="0.229" stop-color="#00873F"/>
|
|
||||||
<stop offset="0.743" stop-color="#40A737"/>
|
|
||||||
<stop offset="1" stop-color="#5CB531"/>
|
|
||||||
</linearGradient>
|
|
||||||
<path fill="url(#SVGID_1_)" d="M22.7,12.1h1.9c0.1,0,0.2,0,0.2,0c0.4-0.1,0.7-0.4,0.7-0.9c0-0.4-0.3-0.8-0.7-0.9c-0.1,0-0.2,0-0.2,0h-1.9
|
|
||||||
V12.1z"/>
|
|
||||||
|
|
||||||
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-856.4599" y1="503.3283" x2="-855.8034" y2="503.3283" gradientTransform="matrix(12.5258 0 0 -12.5258 10748.9648 6314.5825)">
|
|
||||||
<stop offset="0" stop-color="#007940"/>
|
|
||||||
<stop offset="0.229" stop-color="#00873F"/>
|
|
||||||
<stop offset="0.743" stop-color="#40A737"/>
|
|
||||||
<stop offset="1" stop-color="#5CB531"/>
|
|
||||||
</linearGradient>
|
|
||||||
<path fill="url(#SVGID_2_)" d="M24.5,0c-1.8,0-3.3,1.5-3.3,3.3v3.5h4.7c0.1,0,0.2,0,0.3,0C27.2,6.9,28,7.4,28,8.4c0,0.8-0.5,1.4-1.5,1.5v0
|
|
||||||
c1.1,0.1,1.9,0.7,1.9,1.6c0,1-0.9,1.7-2.1,1.7h-5.2V20H26c1.8,0,3.3-1.5,3.3-3.3V0L24.5,0z"/>
|
|
||||||
|
|
||||||
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-856.4599" y1="503.4401" x2="-855.8029" y2="503.4401" gradientTransform="matrix(12.5258 0 0 -12.5258 10748.9648 6314.5825)">
|
|
||||||
<stop offset="0" stop-color="#007940"/>
|
|
||||||
<stop offset="0.229" stop-color="#00873F"/>
|
|
||||||
<stop offset="0.743" stop-color="#40A737"/>
|
|
||||||
<stop offset="1" stop-color="#5CB531"/>
|
|
||||||
</linearGradient>
|
|
||||||
<path fill="url(#SVGID_3_)" d="M25.3,8.6c0-0.4-0.3-0.7-0.7-0.8c0,0-0.1,0-0.2,0h-1.7v1.6h1.7c0.1,0,0.2,0,0.2,0C25,9.3,25.3,9,25.3,8.6
|
|
||||||
L25.3,8.6z"/>
|
|
||||||
|
|
||||||
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-857.9309" y1="503.329" x2="-857.2637" y2="503.329" gradientTransform="matrix(12.5258 0 0 -12.5258 10748.9648 6314.5825)">
|
|
||||||
<stop offset="0" stop-color="#1F286F"/>
|
|
||||||
<stop offset="0.475" stop-color="#004E94"/>
|
|
||||||
<stop offset="0.826" stop-color="#0066B1"/>
|
|
||||||
<stop offset="1" stop-color="#006FBC"/>
|
|
||||||
</linearGradient>
|
|
||||||
<path fill="url(#SVGID_4_)" d="M6,0C4.2,0,2.7,1.5,2.7,3.3v8.2c0.9,0.5,1.9,0.8,2.9,0.8c1.2,0,1.8-0.7,1.8-1.6V6.8h2.9v3.9
|
|
||||||
c0,1.5-0.9,2.7-4.1,2.7c-1.9,0-3.4-0.4-3.4-0.4v7h4.9c1.8,0,3.3-1.5,3.3-3.3V0L6,0z"/>
|
|
||||||
|
|
||||||
<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-857.1989" y1="503.3275" x2="-856.5508" y2="503.3275" gradientTransform="matrix(12.5258 0 0 -12.5258 10748.9648 6314.5825)">
|
|
||||||
<stop offset="0" stop-color="#6C2C2F"/>
|
|
||||||
<stop offset="0.173" stop-color="#882730"/>
|
|
||||||
<stop offset="0.573" stop-color="#BE1833"/>
|
|
||||||
<stop offset="0.859" stop-color="#DC0436"/>
|
|
||||||
<stop offset="1" stop-color="#E60039"/>
|
|
||||||
</linearGradient>
|
|
||||||
<path fill="url(#SVGID_5_)" d="M15.2,0c-1.8,0-3.3,1.5-3.3,3.3v4.4c0.8-0.7,2.3-1.2,4.7-1.1C17.8,6.7,19.2,7,19.2,7v1.4
|
|
||||||
c-0.7-0.3-1.5-0.7-2.5-0.7c-1.8-0.1-2.9,0.8-2.9,2.3c0,1.6,1.1,2.4,2.9,2.3c1-0.1,1.8-0.4,2.5-0.7V13c0,0-1.3,0.3-2.6,0.4
|
|
||||||
c-2.4,0.1-3.8-0.3-4.7-1.1V20h4.9c1.8,0,3.3-1.5,3.3-3.3V0L15.2,0z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB |
Loading…
Reference in New Issue
Block a user