first cut with just inline replace
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
2700c39632
commit
d013f07db3
@ -47,14 +47,10 @@ open class Control: UIControl, ViewProtocol, UserInfoable, Clickable {
|
||||
//--------------------------------------------------
|
||||
open var shouldUpdateView: Bool = true
|
||||
|
||||
open var shouldUpdateAccessibility: Bool = true
|
||||
|
||||
open var userInfo = [String: Primitive]()
|
||||
|
||||
open var surface: Surface = .light { didSet { setNeedsUpdate() } }
|
||||
|
||||
open var accessibilityAction: ((Control) -> Void)?
|
||||
|
||||
/// Whether the Control is selected or not.
|
||||
open override var isSelected: Bool { didSet { setNeedsUpdate() } }
|
||||
|
||||
@ -123,22 +119,138 @@ open class Control: UIControl, ViewProtocol, UserInfoable, Clickable {
|
||||
//--------------------------------------------------
|
||||
// MARK: - Overrides
|
||||
//--------------------------------------------------
|
||||
/// Implement accessibilityActivate on an element in order to handle the default action.
|
||||
/// - Returns: Based on whether the userInteraction is enabled.
|
||||
open override func accessibilityActivate() -> Bool {
|
||||
// Hold state in case User wanted isAnimated to remain off.
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
|
||||
if let accessibilityAction {
|
||||
accessibilityAction(self)
|
||||
}
|
||||
|
||||
sendActions(for: .touchUpInside)
|
||||
return true
|
||||
}
|
||||
|
||||
open override func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
setNeedsUpdate()
|
||||
}
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Accessibility
|
||||
//--------------------------------------------------
|
||||
open var shouldUpdateAccessibility: Bool = true
|
||||
|
||||
open var accessibilityAction: ((Control) -> Void)?
|
||||
|
||||
private var _isAccessibilityElement: Bool = false
|
||||
open override var isAccessibilityElement: Bool {
|
||||
get {
|
||||
var block: AXBoolReturnBlock?
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// block = isAccessibilityElementBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_isAccessibilityElementBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _isAccessibilityElement
|
||||
}
|
||||
}
|
||||
set {
|
||||
_isAccessibilityElement = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityLabel: String?
|
||||
open override var accessibilityLabel: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityLabelBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityLabelBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityLabel
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityLabel = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityHint: String?
|
||||
open override var accessibilityHint: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityHintBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityHintBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityHint
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityHint = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityValue: String?
|
||||
open override var accessibilityValue: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityHintBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityValueBlock
|
||||
}
|
||||
|
||||
if let block{
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityValue
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityValue = newValue
|
||||
}
|
||||
}
|
||||
|
||||
open override func accessibilityActivate() -> Bool {
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
var value = true
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// if let block = accessibilityAction {
|
||||
// block(self)
|
||||
// } else if let block = accessibilityActivateBlock {
|
||||
// value = block()
|
||||
//
|
||||
// } else if let block = bridge_accessibilityActivateBlock {
|
||||
// value = block()
|
||||
// }
|
||||
//
|
||||
// } else {
|
||||
if let block = accessibilityAction {
|
||||
block(self)
|
||||
|
||||
} else if let block = bridge_accessibilityActivateBlock {
|
||||
value = block()
|
||||
}
|
||||
// }
|
||||
|
||||
sendActions(for: .touchUpInside)
|
||||
return value
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -137,13 +137,33 @@ open class SelectorBase: Control, SelectorControlable {
|
||||
|
||||
open override func accessibilityActivate() -> Bool {
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
var value = true
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// if let block = accessibilityAction {
|
||||
// block(self)
|
||||
//
|
||||
// } else if let block = accessibilityActivateBlock {
|
||||
// value = block()
|
||||
//
|
||||
// } else if let block = bridge_accessibilityActivateBlock {
|
||||
// value = block()
|
||||
//
|
||||
// } else {
|
||||
// toggle()
|
||||
// }
|
||||
// } else {
|
||||
if let block = accessibilityAction {
|
||||
block(self)
|
||||
|
||||
} else if let block = bridge_accessibilityActivateBlock {
|
||||
value = block()
|
||||
|
||||
if let accessibilityAction {
|
||||
accessibilityAction(self)
|
||||
} else {
|
||||
toggle()
|
||||
}
|
||||
|
||||
return true
|
||||
// }
|
||||
return value
|
||||
}
|
||||
}
|
||||
|
||||
@ -377,13 +377,32 @@ open class SelectorItemBase<Selector: SelectorBase>: Control, Errorable, Changea
|
||||
|
||||
open override func accessibilityActivate() -> Bool {
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
var value = true
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// if let block = accessibilityAction {
|
||||
// block(self)
|
||||
//
|
||||
// } else if let block = accessibilityActivateBlock {
|
||||
// value = block()
|
||||
//
|
||||
// } else if let block = bridge_accessibilityActivateBlock {
|
||||
// value = block()
|
||||
//
|
||||
// } else {
|
||||
// toggle()
|
||||
// }
|
||||
// } else {
|
||||
if let block = accessibilityAction {
|
||||
block(self)
|
||||
|
||||
} else if let block = bridge_accessibilityActivateBlock {
|
||||
value = block()
|
||||
|
||||
if let accessibilityAction {
|
||||
accessibilityAction(self)
|
||||
} else {
|
||||
toggle()
|
||||
}
|
||||
|
||||
return true
|
||||
// }
|
||||
return value
|
||||
}
|
||||
}
|
||||
|
||||
@ -46,8 +46,6 @@ open class View: UIView, ViewProtocol, UserInfoable {
|
||||
//--------------------------------------------------
|
||||
open var shouldUpdateView: Bool = true
|
||||
|
||||
open var shouldUpdateAccessibility: Bool = true
|
||||
|
||||
/// Dictionary for keeping information for this Control use only Primitives.
|
||||
open var userInfo = [String: Primitive]()
|
||||
|
||||
@ -55,8 +53,6 @@ open class View: UIView, ViewProtocol, UserInfoable {
|
||||
|
||||
open var isEnabled: Bool = true { didSet { setNeedsUpdate() } }
|
||||
|
||||
open var accessibilityAction: ((View) -> Void)?
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Lifecycle
|
||||
//--------------------------------------------------
|
||||
@ -90,17 +86,143 @@ open class View: UIView, ViewProtocol, UserInfoable {
|
||||
isEnabled = true
|
||||
}
|
||||
|
||||
open override func accessibilityActivate() -> Bool {
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
if let accessibilityAction {
|
||||
accessibilityAction(self)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
open override func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
setNeedsUpdate()
|
||||
}
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Accessibility
|
||||
//--------------------------------------------------
|
||||
open var shouldUpdateAccessibility: Bool = true
|
||||
|
||||
open var accessibilityAction: ((View) -> Void)?
|
||||
|
||||
private var _isAccessibilityElement: Bool = false
|
||||
open override var isAccessibilityElement: Bool {
|
||||
get {
|
||||
var block: AXBoolReturnBlock?
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// block = isAccessibilityElementBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_isAccessibilityElementBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _isAccessibilityElement
|
||||
}
|
||||
}
|
||||
set {
|
||||
_isAccessibilityElement = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityLabel: String?
|
||||
open override var accessibilityLabel: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityLabelBlock
|
||||
// }
|
||||
//
|
||||
if block == nil {
|
||||
block = bridge_accessibilityLabelBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityLabel
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityLabel = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityHint: String?
|
||||
open override var accessibilityHint: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityHintBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityHintBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityHint
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityHint = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityValue: String?
|
||||
open override var accessibilityValue: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityHintBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityValueBlock
|
||||
}
|
||||
|
||||
if let block{
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityValue
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityValue = newValue
|
||||
}
|
||||
}
|
||||
|
||||
open override func accessibilityActivate() -> Bool {
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// if let block = accessibilityAction {
|
||||
// block(self)
|
||||
// return true
|
||||
// } else if let block = accessibilityActivateBlock {
|
||||
// return block()
|
||||
//
|
||||
// } else if let block = bridge_accessibilityActivateBlock {
|
||||
// return block()
|
||||
//
|
||||
// } else {
|
||||
// return true
|
||||
//
|
||||
// }
|
||||
//
|
||||
// } else {
|
||||
if let block = accessibilityAction {
|
||||
block(self)
|
||||
return true
|
||||
|
||||
} else if let block = bridge_accessibilityActivateBlock {
|
||||
return block()
|
||||
|
||||
} else {
|
||||
return true
|
||||
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -10,10 +10,10 @@ import UIKit
|
||||
|
||||
/// Custom UIAccessibilityElement that allows you to set the default action used in accessibilityActivate.
|
||||
public class AccessibilityActionElement: UIAccessibilityElement {
|
||||
var action: (() -> Void)?
|
||||
public var accessibilityAction: AXVoidReturnBlock?
|
||||
|
||||
public override func accessibilityActivate() -> Bool {
|
||||
action?()
|
||||
accessibilityAction?()
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
@ -51,8 +51,6 @@ open class ButtonBase: UIButton, ViewProtocol, UserInfoable, Clickable {
|
||||
/// Key of whether or not updateView() is called in setNeedsUpdate()
|
||||
open var shouldUpdateView: Bool = true
|
||||
|
||||
open var shouldUpdateAccessibility: Bool = true
|
||||
|
||||
open var surface: Surface = .light { didSet { setNeedsUpdate() } }
|
||||
|
||||
/// Text that will be used in the titleLabel.
|
||||
@ -78,8 +76,6 @@ open class ButtonBase: UIButton, ViewProtocol, UserInfoable, Clickable {
|
||||
/// Whether the Button should handle the isHighlighted state.
|
||||
open var shouldHighlight: Bool { isHighlighting == false }
|
||||
|
||||
open var accessibilityAction: ((ButtonBase) -> Void)?
|
||||
|
||||
/// Whether the Control is highlighted or not.
|
||||
open override var isHighlighted: Bool {
|
||||
didSet {
|
||||
@ -144,15 +140,6 @@ open class ButtonBase: UIButton, ViewProtocol, UserInfoable, Clickable {
|
||||
setNeedsUpdate()
|
||||
}
|
||||
|
||||
open override func accessibilityActivate() -> Bool {
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
if let accessibilityAction {
|
||||
accessibilityAction(self)
|
||||
}
|
||||
sendActions(for: .touchUpInside)
|
||||
return true
|
||||
}
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Private Methods
|
||||
//--------------------------------------------------
|
||||
@ -185,6 +172,135 @@ open class ButtonBase: UIButton, ViewProtocol, UserInfoable, Clickable {
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Accessibility
|
||||
//--------------------------------------------------
|
||||
open var shouldUpdateAccessibility: Bool = true
|
||||
|
||||
open var accessibilityAction: ((ButtonBase) -> Void)?
|
||||
|
||||
private var _isAccessibilityElement: Bool = false
|
||||
open override var isAccessibilityElement: Bool {
|
||||
get {
|
||||
var block: AXBoolReturnBlock?
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// block = isAccessibilityElementBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_isAccessibilityElementBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _isAccessibilityElement
|
||||
}
|
||||
}
|
||||
set {
|
||||
_isAccessibilityElement = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityLabel: String?
|
||||
open override var accessibilityLabel: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityLabelBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityLabelBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityLabel
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityLabel = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityHint: String?
|
||||
open override var accessibilityHint: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityHintBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityHintBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityHint
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityHint = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityValue: String?
|
||||
open override var accessibilityValue: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityHintBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityValueBlock
|
||||
}
|
||||
|
||||
if let block{
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityValue
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityValue = newValue
|
||||
}
|
||||
}
|
||||
|
||||
open override func accessibilityActivate() -> Bool {
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
var value = true
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// if let block = accessibilityAction {
|
||||
// block(self)
|
||||
// } else if let block = accessibilityActivateBlock {
|
||||
// value = block()
|
||||
//
|
||||
// } else if let block = bridge_accessibilityActivateBlock {
|
||||
// value = block()
|
||||
// }
|
||||
//
|
||||
// } else {
|
||||
if let block = accessibilityAction {
|
||||
block(self)
|
||||
|
||||
} else if let block = bridge_accessibilityActivateBlock {
|
||||
value = block()
|
||||
}
|
||||
// }
|
||||
|
||||
sendActions(for: .touchUpInside)
|
||||
return value
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: AppleGuidelinesTouchable
|
||||
|
||||
@ -108,8 +108,6 @@ open class Label: UILabel, ViewProtocol, UserInfoable {
|
||||
/// Key of whether or not updateView() is called in setNeedsUpdate()
|
||||
open var shouldUpdateView: Bool = true
|
||||
|
||||
open var shouldUpdateAccessibility: Bool = true
|
||||
|
||||
/// Will determine if a scaled font should be used for the font.
|
||||
open var useScaledFont: Bool = false { didSet { setNeedsUpdate() }}
|
||||
|
||||
@ -132,8 +130,6 @@ open class Label: UILabel, ViewProtocol, UserInfoable {
|
||||
/// Line break mode for the label, default is set to word wrapping.
|
||||
open override var lineBreakMode: NSLineBreakMode { didSet { setNeedsUpdate() }}
|
||||
|
||||
open var accessibilityAction: ((Label) -> Void)?
|
||||
|
||||
/// Text that will be used in the label.
|
||||
private var _text: String!
|
||||
override open var text: String! {
|
||||
@ -366,7 +362,7 @@ open class Label: UILabel, ViewProtocol, UserInfoable {
|
||||
let labelAction = LabelAction(range: actionable.range, action: actionable.action)
|
||||
|
||||
// set the action of the accessibilityElement
|
||||
customAccessibilityAction?.action = { [weak self] in
|
||||
customAccessibilityAction?.accessibilityAction = { [weak self] in
|
||||
guard let self, isEnabled else { return }
|
||||
labelAction.performAction()
|
||||
}
|
||||
@ -456,10 +452,139 @@ open class Label: UILabel, ViewProtocol, UserInfoable {
|
||||
return element
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Accessibility
|
||||
//--------------------------------------------------
|
||||
open var shouldUpdateAccessibility: Bool = true
|
||||
|
||||
open var accessibilityAction: ((Label) -> Void)?
|
||||
|
||||
private var _isAccessibilityElement: Bool = false
|
||||
open override var isAccessibilityElement: Bool {
|
||||
get {
|
||||
var block: AXBoolReturnBlock?
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// block = isAccessibilityElementBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_isAccessibilityElementBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _isAccessibilityElement
|
||||
}
|
||||
}
|
||||
set {
|
||||
_isAccessibilityElement = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityLabel: String?
|
||||
open override var accessibilityLabel: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityLabelBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityLabelBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityLabel
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityLabel = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityHint: String?
|
||||
open override var accessibilityHint: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityHintBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityHintBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityHint
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityHint = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityValue: String?
|
||||
open override var accessibilityValue: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityHintBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityValueBlock
|
||||
}
|
||||
|
||||
if let block{
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityValue
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityValue = newValue
|
||||
}
|
||||
}
|
||||
|
||||
open override func accessibilityActivate() -> Bool {
|
||||
guard let accessibilityAction, isEnabled, isUserInteractionEnabled else { return false }
|
||||
accessibilityAction(self)
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// if let block = accessibilityAction {
|
||||
// block(self)
|
||||
// return true
|
||||
// } else if let block = accessibilityActivateBlock {
|
||||
// return block()
|
||||
//
|
||||
// } else if let block = bridge_accessibilityActivateBlock {
|
||||
// return block()
|
||||
//
|
||||
// } else {
|
||||
// return true
|
||||
//
|
||||
// }
|
||||
//
|
||||
// } else {
|
||||
if let block = accessibilityAction {
|
||||
block(self)
|
||||
return true
|
||||
|
||||
} else if let block = bridge_accessibilityActivateBlock {
|
||||
return block()
|
||||
|
||||
} else {
|
||||
return true
|
||||
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -47,6 +47,9 @@ open class TextField: UITextField, ViewProtocol, Errorable {
|
||||
//--------------------------------------------------
|
||||
// MARK: - Properties
|
||||
//--------------------------------------------------
|
||||
/// Key of whether or not updateView() is called in setNeedsUpdate()
|
||||
open var shouldUpdateView: Bool = true
|
||||
|
||||
private var formatLabel = Label().with {
|
||||
$0.tag = 999
|
||||
$0.textColorConfiguration = ViewColorConfiguration().with {
|
||||
@ -64,9 +67,6 @@ open class TextField: UITextField, ViewProtocol, Errorable {
|
||||
/// Will determine if a scaled font should be used for the titleLabel font.
|
||||
open var useScaledFont: Bool = false { didSet { setNeedsUpdate() } }
|
||||
|
||||
/// Key of whether or not updateView() is called in setNeedsUpdate()
|
||||
open var shouldUpdateView: Bool = true
|
||||
|
||||
open var shouldUpdateAccessibility: Bool = true
|
||||
|
||||
open var surface: Surface = .light { didSet { setNeedsUpdate() } }
|
||||
@ -77,8 +77,6 @@ open class TextField: UITextField, ViewProtocol, Errorable {
|
||||
|
||||
open var lineBreakMode: NSLineBreakMode = .byClipping { didSet { setNeedsUpdate() } }
|
||||
|
||||
open var accessibilityAction: ((TextField) -> Void)?
|
||||
|
||||
open override var isEnabled: Bool { didSet { setNeedsUpdate() } }
|
||||
|
||||
open var textColorConfiguration: AnyColorable = ViewColorConfiguration().with {
|
||||
@ -213,17 +211,6 @@ open class TextField: UITextField, ViewProtocol, Errorable {
|
||||
return success
|
||||
}
|
||||
|
||||
open override func accessibilityActivate() -> Bool {
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
|
||||
if let accessibilityAction {
|
||||
accessibilityAction(self)
|
||||
return true
|
||||
} else {
|
||||
return super.accessibilityActivate()
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Private Methods
|
||||
//--------------------------------------------------
|
||||
@ -245,6 +232,138 @@ open class TextField: UITextField, ViewProtocol, Errorable {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Accessibility
|
||||
//--------------------------------------------------
|
||||
open var accessibilityAction: ((TextField) -> Void)?
|
||||
|
||||
private var _isAccessibilityElement: Bool = false
|
||||
open override var isAccessibilityElement: Bool {
|
||||
get {
|
||||
var block: AXBoolReturnBlock?
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// block = isAccessibilityElementBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_isAccessibilityElementBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _isAccessibilityElement
|
||||
}
|
||||
}
|
||||
set {
|
||||
_isAccessibilityElement = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityLabel: String?
|
||||
open override var accessibilityLabel: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityLabelBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityLabelBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityLabel
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityLabel = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityHint: String?
|
||||
open override var accessibilityHint: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityHintBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityHintBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityHint
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityHint = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityValue: String?
|
||||
open override var accessibilityValue: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityHintBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityValueBlock
|
||||
}
|
||||
|
||||
if let block{
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityValue
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityValue = newValue
|
||||
}
|
||||
}
|
||||
|
||||
open override func accessibilityActivate() -> Bool {
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// if let block = accessibilityAction {
|
||||
// block(self)
|
||||
// return true
|
||||
// } else if let block = accessibilityActivateBlock {
|
||||
// return block()
|
||||
//
|
||||
// } else if let block = bridge_accessibilityActivateBlock {
|
||||
// return block()
|
||||
//
|
||||
// } else {
|
||||
// return super.accessibilityActivate()
|
||||
//
|
||||
// }
|
||||
//
|
||||
// } else {
|
||||
if let block = accessibilityAction {
|
||||
block(self)
|
||||
return true
|
||||
|
||||
} else if let block = bridge_accessibilityActivateBlock {
|
||||
return block()
|
||||
|
||||
} else {
|
||||
return super.accessibilityActivate()
|
||||
|
||||
}
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
extension UITextField {
|
||||
|
||||
@ -48,8 +48,6 @@ open class TextView: UITextView, ViewProtocol, Errorable {
|
||||
/// Key of whether or not updateView() is called in setNeedsUpdate()
|
||||
open var shouldUpdateView: Bool = true
|
||||
|
||||
open var shouldUpdateAccessibility: Bool = true
|
||||
|
||||
open var surface: Surface = .light { didSet { setNeedsUpdate() } }
|
||||
|
||||
/// Array of LabelAttributeModel objects used in rendering the text.
|
||||
@ -68,8 +66,6 @@ open class TextView: UITextView, ViewProtocol, Errorable {
|
||||
$0.setSurfaceColors(VDSColor.elementsPrimaryOnlight, VDSColor.elementsPrimaryOndark, forDisabled: false)
|
||||
}.eraseToAnyColorable(){ didSet { setNeedsUpdate() }}
|
||||
|
||||
open var accessibilityAction: ((TextView) -> Void)?
|
||||
|
||||
open var showError: Bool = false { didSet { setNeedsUpdate() } }
|
||||
|
||||
open var errorText: String? { didSet { setNeedsUpdate() } }
|
||||
@ -149,15 +145,139 @@ open class TextView: UITextView, ViewProtocol, Errorable {
|
||||
setNeedsUpdate()
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Accessibility
|
||||
//--------------------------------------------------
|
||||
open var shouldUpdateAccessibility: Bool = true
|
||||
|
||||
open var accessibilityAction: ((TextView) -> Void)?
|
||||
|
||||
private var _isAccessibilityElement: Bool = false
|
||||
open override var isAccessibilityElement: Bool {
|
||||
get {
|
||||
var block: AXBoolReturnBlock?
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// block = isAccessibilityElementBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_isAccessibilityElementBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _isAccessibilityElement
|
||||
}
|
||||
}
|
||||
set {
|
||||
_isAccessibilityElement = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityLabel: String?
|
||||
open override var accessibilityLabel: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityLabelBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityLabelBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityLabel
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityLabel = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityHint: String?
|
||||
open override var accessibilityHint: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityHintBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityHintBlock
|
||||
}
|
||||
|
||||
if let block {
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityHint
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityHint = newValue
|
||||
}
|
||||
}
|
||||
|
||||
private var _accessibilityValue: String?
|
||||
open override var accessibilityValue: String? {
|
||||
get {
|
||||
var block: AXStringReturnBlock?
|
||||
|
||||
// if #available(iOS 17, *) {
|
||||
// block = accessibilityHintBlock
|
||||
// }
|
||||
|
||||
if block == nil {
|
||||
block = bridge_accessibilityValueBlock
|
||||
}
|
||||
|
||||
if let block{
|
||||
return block()
|
||||
} else {
|
||||
return _accessibilityValue
|
||||
}
|
||||
}
|
||||
set {
|
||||
_accessibilityValue = newValue
|
||||
}
|
||||
}
|
||||
|
||||
open override func accessibilityActivate() -> Bool {
|
||||
guard isEnabled, isUserInteractionEnabled else { return false }
|
||||
|
||||
if let accessibilityAction {
|
||||
accessibilityAction(self)
|
||||
// if #available(iOS 17, *) {
|
||||
// if let block = accessibilityAction {
|
||||
// block(self)
|
||||
// return true
|
||||
// } else if let block = accessibilityActivateBlock {
|
||||
// return block()
|
||||
//
|
||||
// } else if let block = bridge_accessibilityActivateBlock {
|
||||
// return block()
|
||||
//
|
||||
// } else {
|
||||
// return super.accessibilityActivate()
|
||||
//
|
||||
// }
|
||||
//
|
||||
// } else {
|
||||
if let block = accessibilityAction {
|
||||
block(self)
|
||||
return true
|
||||
|
||||
} else if let block = bridge_accessibilityActivateBlock {
|
||||
return block()
|
||||
|
||||
} else {
|
||||
return super.accessibilityActivate()
|
||||
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
//--------------------------------------------------
|
||||
|
||||
@ -70,3 +70,86 @@ extension ViewProtocol where Self: UIControl {
|
||||
}).store(in: &subscribers)
|
||||
}
|
||||
}
|
||||
|
||||
public protocol AccessibilityUpdatable {
|
||||
// Basic accessibility
|
||||
var bridge_isAccessibilityElementBlock: AXBoolReturnBlock? { get set }
|
||||
|
||||
var bridge_accessibilityLabelBlock: AXStringReturnBlock? { get set }
|
||||
|
||||
var bridge_accessibilityValueBlock: AXStringReturnBlock? { get set }
|
||||
|
||||
var bridge_accessibilityHintBlock: AXStringReturnBlock? { get set }
|
||||
|
||||
var bridge_accessibilityActivateBlock: AXBoolReturnBlock? { get set }
|
||||
|
||||
}
|
||||
|
||||
extension NSObject: AccessibilityUpdatable {
|
||||
static var isAccessibilityElementBlockKey: UInt8 = 0
|
||||
static var activateBlockKey: UInt8 = 1
|
||||
static var valueBlockKey: UInt8 = 2
|
||||
static var hintBlockKey: UInt8 = 3
|
||||
static var labelBlockKey: UInt8 = 4
|
||||
|
||||
public var bridge_isAccessibilityElementBlock: AXBoolReturnBlock? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &NSObject.isAccessibilityElementBlockKey) as? AXBoolReturnBlock
|
||||
}
|
||||
set {
|
||||
objc_setAssociatedObject(self, &NSObject.isAccessibilityElementBlockKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
// if #available(iOS 17, *) {
|
||||
// self.isAccessibilityElementBlock = newValue
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
public var bridge_accessibilityActivateBlock: AXBoolReturnBlock? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &NSObject.activateBlockKey) as? AXBoolReturnBlock
|
||||
}
|
||||
set {
|
||||
objc_setAssociatedObject(self, &NSObject.activateBlockKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
// if #available(iOS 17, *) {
|
||||
// self.accessibilityActivateBlock = newValue
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
public var bridge_accessibilityValueBlock: AXStringReturnBlock? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &NSObject.valueBlockKey) as? AXStringReturnBlock
|
||||
}
|
||||
set {
|
||||
objc_setAssociatedObject(self, &NSObject.valueBlockKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
// if #available(iOS 17, *) {
|
||||
// self.accessibilityValueBlock = newValue
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
public var bridge_accessibilityHintBlock: AXStringReturnBlock? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &NSObject.hintBlockKey) as? AXStringReturnBlock
|
||||
}
|
||||
set {
|
||||
objc_setAssociatedObject(self, &NSObject.hintBlockKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
// if #available(iOS 17, *) {
|
||||
// self.accessibilityHintBlock = newValue
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
public var bridge_accessibilityLabelBlock: AXStringReturnBlock? {
|
||||
get {
|
||||
return objc_getAssociatedObject(self, &NSObject.labelBlockKey) as? AXStringReturnBlock
|
||||
}
|
||||
set {
|
||||
objc_setAssociatedObject(self, &NSObject.labelBlockKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
||||
// if #available(iOS 17, *) {
|
||||
// self.accessibilityLabelBlock = newValue
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user