Merge branch 'develop' into feature/new_loading_spinner
@ -118,6 +118,8 @@
|
|||||||
27F9736A246750BE00CAB5C5 /* ScreenBrightnessModifierBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27F97369246750BE00CAB5C5 /* ScreenBrightnessModifierBehavior.swift */; };
|
27F9736A246750BE00CAB5C5 /* ScreenBrightnessModifierBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27F97369246750BE00CAB5C5 /* ScreenBrightnessModifierBehavior.swift */; };
|
||||||
31BE15CB23D8924D00452370 /* CheckboxLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BE15C923D8924C00452370 /* CheckboxLabelModel.swift */; };
|
31BE15CB23D8924D00452370 /* CheckboxLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BE15C923D8924C00452370 /* CheckboxLabelModel.swift */; };
|
||||||
31BE15CC23D8924D00452370 /* CheckboxModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BE15CA23D8924C00452370 /* CheckboxModel.swift */; };
|
31BE15CC23D8924D00452370 /* CheckboxModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BE15CA23D8924C00452370 /* CheckboxModel.swift */; };
|
||||||
|
324FB6AA249366F3002552C7 /* ListLeftVariableNumberedListBodyTextModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 324FB6A9249366F3002552C7 /* ListLeftVariableNumberedListBodyTextModel.swift */; };
|
||||||
|
324FB6AC24936717002552C7 /* ListLeftVariableNumberedListBodyText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 324FB6AB24936717002552C7 /* ListLeftVariableNumberedListBodyText.swift */; };
|
||||||
32F8804624765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F8804524765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift */; };
|
32F8804624765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F8804524765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift */; };
|
||||||
32F8804824765C8400C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F8804724765C8400C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinks.swift */; };
|
32F8804824765C8400C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F8804724765C8400C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinks.swift */; };
|
||||||
522679C123FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 522679BF23FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift */; };
|
522679C123FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 522679BF23FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift */; };
|
||||||
@ -323,6 +325,7 @@
|
|||||||
D27CD40E2322EEAF00C1DC07 /* TabsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */; };
|
D27CD40E2322EEAF00C1DC07 /* TabsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */; };
|
||||||
D27CD4102339057800C1DC07 /* EyebrowHeadlineBodyLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27CD40F2339057800C1DC07 /* EyebrowHeadlineBodyLink.swift */; };
|
D27CD4102339057800C1DC07 /* EyebrowHeadlineBodyLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27CD40F2339057800C1DC07 /* EyebrowHeadlineBodyLink.swift */; };
|
||||||
D282AABA224131D100C46919 /* MFTransparentGIFView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */; };
|
D282AABA224131D100C46919 /* MFTransparentGIFView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */; };
|
||||||
|
D2874024249BA6F300BE950A /* MVMCoreUISplitViewController+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2874023249BA6F300BE950A /* MVMCoreUISplitViewController+Extension.swift */; };
|
||||||
D28764AA2458980300CB882D /* ThreeLayerFillMiddleTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28764A92458980300CB882D /* ThreeLayerFillMiddleTemplate.swift */; };
|
D28764AA2458980300CB882D /* ThreeLayerFillMiddleTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28764A92458980300CB882D /* ThreeLayerFillMiddleTemplate.swift */; };
|
||||||
D28764AC245898A400CB882D /* ThreeLayerFillMiddleTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28764AB245898A400CB882D /* ThreeLayerFillMiddleTemplateModel.swift */; };
|
D28764AC245898A400CB882D /* ThreeLayerFillMiddleTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28764AB245898A400CB882D /* ThreeLayerFillMiddleTemplateModel.swift */; };
|
||||||
D28764F9245A327200CB882D /* TwoLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28764F8245A327200CB882D /* TwoLinkView.swift */; };
|
D28764F9245A327200CB882D /* TwoLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D28764F8245A327200CB882D /* TwoLinkView.swift */; };
|
||||||
@ -565,6 +568,8 @@
|
|||||||
27F97369246750BE00CAB5C5 /* ScreenBrightnessModifierBehavior.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenBrightnessModifierBehavior.swift; sourceTree = "<group>"; };
|
27F97369246750BE00CAB5C5 /* ScreenBrightnessModifierBehavior.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenBrightnessModifierBehavior.swift; sourceTree = "<group>"; };
|
||||||
31BE15C923D8924C00452370 /* CheckboxLabelModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckboxLabelModel.swift; sourceTree = "<group>"; };
|
31BE15C923D8924C00452370 /* CheckboxLabelModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckboxLabelModel.swift; sourceTree = "<group>"; };
|
||||||
31BE15CA23D8924C00452370 /* CheckboxModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckboxModel.swift; sourceTree = "<group>"; };
|
31BE15CA23D8924C00452370 /* CheckboxModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckboxModel.swift; sourceTree = "<group>"; };
|
||||||
|
324FB6A9249366F3002552C7 /* ListLeftVariableNumberedListBodyTextModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListLeftVariableNumberedListBodyTextModel.swift; sourceTree = "<group>"; };
|
||||||
|
324FB6AB24936717002552C7 /* ListLeftVariableNumberedListBodyText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListLeftVariableNumberedListBodyText.swift; sourceTree = "<group>"; };
|
||||||
32F8804524765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListLeftVariableNumberedListAllTextAndLinksModel.swift; sourceTree = "<group>"; };
|
32F8804524765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListLeftVariableNumberedListAllTextAndLinksModel.swift; sourceTree = "<group>"; };
|
||||||
32F8804724765C8400C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListLeftVariableNumberedListAllTextAndLinks.swift; sourceTree = "<group>"; };
|
32F8804724765C8400C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListLeftVariableNumberedListAllTextAndLinks.swift; sourceTree = "<group>"; };
|
||||||
522679BF23FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListLeftVariableCheckboxAllTextAndLinks.swift; sourceTree = "<group>"; };
|
522679BF23FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListLeftVariableCheckboxAllTextAndLinks.swift; sourceTree = "<group>"; };
|
||||||
@ -769,6 +774,7 @@
|
|||||||
D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsTableViewCell.swift; sourceTree = "<group>"; };
|
D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsTableViewCell.swift; sourceTree = "<group>"; };
|
||||||
D27CD40F2339057800C1DC07 /* EyebrowHeadlineBodyLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EyebrowHeadlineBodyLink.swift; sourceTree = "<group>"; };
|
D27CD40F2339057800C1DC07 /* EyebrowHeadlineBodyLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EyebrowHeadlineBodyLink.swift; sourceTree = "<group>"; };
|
||||||
D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MFTransparentGIFView.swift; sourceTree = "<group>"; };
|
D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MFTransparentGIFView.swift; sourceTree = "<group>"; };
|
||||||
|
D2874023249BA6F300BE950A /* MVMCoreUISplitViewController+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MVMCoreUISplitViewController+Extension.swift"; sourceTree = "<group>"; };
|
||||||
D28764A92458980300CB882D /* ThreeLayerFillMiddleTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerFillMiddleTemplate.swift; sourceTree = "<group>"; };
|
D28764A92458980300CB882D /* ThreeLayerFillMiddleTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerFillMiddleTemplate.swift; sourceTree = "<group>"; };
|
||||||
D28764AB245898A400CB882D /* ThreeLayerFillMiddleTemplateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerFillMiddleTemplateModel.swift; sourceTree = "<group>"; };
|
D28764AB245898A400CB882D /* ThreeLayerFillMiddleTemplateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerFillMiddleTemplateModel.swift; sourceTree = "<group>"; };
|
||||||
D28764F8245A327200CB882D /* TwoLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoLinkView.swift; sourceTree = "<group>"; };
|
D28764F8245A327200CB882D /* TwoLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoLinkView.swift; sourceTree = "<group>"; };
|
||||||
@ -1358,6 +1364,8 @@
|
|||||||
AA997251247530B100FC7472 /* ListLeftVariableIconAllTextLinks.swift */,
|
AA997251247530B100FC7472 /* ListLeftVariableIconAllTextLinks.swift */,
|
||||||
32F8804524765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift */,
|
32F8804524765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift */,
|
||||||
32F8804724765C8400C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinks.swift */,
|
32F8804724765C8400C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinks.swift */,
|
||||||
|
324FB6A9249366F3002552C7 /* ListLeftVariableNumberedListBodyTextModel.swift */,
|
||||||
|
324FB6AB24936717002552C7 /* ListLeftVariableNumberedListBodyText.swift */,
|
||||||
);
|
);
|
||||||
path = LeftVariable;
|
path = LeftVariable;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -1813,6 +1821,7 @@
|
|||||||
D29DF15321E69760003B2FB9 /* MVMCoreUIPanelButtonProtocol.h */,
|
D29DF15321E69760003B2FB9 /* MVMCoreUIPanelButtonProtocol.h */,
|
||||||
D29DF11A21E684A9003B2FB9 /* MVMCoreUISplitViewController.h */,
|
D29DF11A21E684A9003B2FB9 /* MVMCoreUISplitViewController.h */,
|
||||||
D29DF11B21E684A9003B2FB9 /* MVMCoreUISplitViewController.m */,
|
D29DF11B21E684A9003B2FB9 /* MVMCoreUISplitViewController.m */,
|
||||||
|
D2874023249BA6F300BE950A /* MVMCoreUISplitViewController+Extension.swift */,
|
||||||
);
|
);
|
||||||
path = SplitViewController;
|
path = SplitViewController;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -2059,6 +2068,7 @@
|
|||||||
files = (
|
files = (
|
||||||
0A775F2624893916009EFB58 /* ThreeHeadlineBodyLink.swift in Sources */,
|
0A775F2624893916009EFB58 /* ThreeHeadlineBodyLink.swift in Sources */,
|
||||||
AAC6F167243332E400F295C1 /* RadioSwatchesModel.swift in Sources */,
|
AAC6F167243332E400F295C1 /* RadioSwatchesModel.swift in Sources */,
|
||||||
|
324FB6AA249366F3002552C7 /* ListLeftVariableNumberedListBodyTextModel.swift in Sources */,
|
||||||
5248BFED23F12E350059236A /* ListThreeColumnPlanDataDividerModel.swift in Sources */,
|
5248BFED23F12E350059236A /* ListThreeColumnPlanDataDividerModel.swift in Sources */,
|
||||||
AA0A257824766C8A00862F64 /* ListLeftVariableIconWithRightCaretBodyTextModel.swift in Sources */,
|
AA0A257824766C8A00862F64 /* ListLeftVariableIconWithRightCaretBodyTextModel.swift in Sources */,
|
||||||
0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */,
|
0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */,
|
||||||
@ -2260,6 +2270,7 @@
|
|||||||
942C378E2412F5B60066E45E /* ModalMoleculeStackTemplate.swift in Sources */,
|
942C378E2412F5B60066E45E /* ModalMoleculeStackTemplate.swift in Sources */,
|
||||||
8D8067D32444473A00203BE8 /* ListRightVariablePriceChangeAllTextAndLinks.swift in Sources */,
|
8D8067D32444473A00203BE8 /* ListRightVariablePriceChangeAllTextAndLinks.swift in Sources */,
|
||||||
8D4687E4242E2DF300802879 /* ListFourColumnDataUsageListItem.swift in Sources */,
|
8D4687E4242E2DF300802879 /* ListFourColumnDataUsageListItem.swift in Sources */,
|
||||||
|
D2874024249BA6F300BE950A /* MVMCoreUISplitViewController+Extension.swift in Sources */,
|
||||||
01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */,
|
01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */,
|
||||||
0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */,
|
0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */,
|
||||||
011B58F023A2AA980085F53C /* ListItemModelProtocol.swift in Sources */,
|
011B58F023A2AA980085F53C /* ListItemModelProtocol.swift in Sources */,
|
||||||
@ -2315,6 +2326,7 @@
|
|||||||
BB6C6AC0242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTallModel.swift in Sources */,
|
BB6C6AC0242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTallModel.swift in Sources */,
|
||||||
8DEFA95E243DAC2F000D27E5 /* ListThreeColumnDataUsageDivider.swift in Sources */,
|
8DEFA95E243DAC2F000D27E5 /* ListThreeColumnDataUsageDivider.swift in Sources */,
|
||||||
D2A638FD22CA98280052ED1F /* HeadlineBody.swift in Sources */,
|
D2A638FD22CA98280052ED1F /* HeadlineBody.swift in Sources */,
|
||||||
|
324FB6AC24936717002552C7 /* ListLeftVariableNumberedListBodyText.swift in Sources */,
|
||||||
AAA74A172410C04600080241 /* HeadersH2NoButtonsBodyText.swift in Sources */,
|
AAA74A172410C04600080241 /* HeadersH2NoButtonsBodyText.swift in Sources */,
|
||||||
522679C223FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinksModel.swift in Sources */,
|
522679C223FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinksModel.swift in Sources */,
|
||||||
AA7F32AB246C0F7900C965BA /* ListLeftVariableRadioButtonAllTextAndLinksModel.swift in Sources */,
|
AA7F32AB246C0F7900C965BA /* ListLeftVariableRadioButtonAllTextAndLinksModel.swift in Sources */,
|
||||||
|
|||||||
@ -157,9 +157,9 @@ import MVMCore
|
|||||||
override public init(frame: CGRect) {
|
override public init(frame: CGRect) {
|
||||||
super.init(frame: frame)
|
super.init(frame: frame)
|
||||||
|
|
||||||
accessibilityTraits = .button
|
|
||||||
isAccessibilityElement = true
|
isAccessibilityElement = true
|
||||||
accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "checkbox_action_hint")
|
accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "checkbox_action_hint")
|
||||||
|
accessibilityTraits = .button
|
||||||
updateAccessibilityLabel()
|
updateAccessibilityLabel()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -147,8 +147,8 @@ import UIKit
|
|||||||
|
|
||||||
addTarget(self, action: #selector(tapAction), for: .touchUpInside)
|
addTarget(self, action: #selector(tapAction), for: .touchUpInside)
|
||||||
isAccessibilityElement = true
|
isAccessibilityElement = true
|
||||||
accessibilityTraits = .button
|
|
||||||
accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "radio_action_hint")
|
accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "radio_action_hint")
|
||||||
|
accessibilityTraits = .button
|
||||||
updateAccessibilityLabel()
|
updateAccessibilityLabel()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -115,12 +115,12 @@ open class BarsIndicatorView: CarouselIndicator {
|
|||||||
|
|
||||||
for i in 0..<numberOfPages {
|
for i in 0..<numberOfPages {
|
||||||
let bar = View()
|
let bar = View()
|
||||||
bar.accessibilityTraits = .button
|
|
||||||
bar.isAccessibilityElement = true
|
bar.isAccessibilityElement = true
|
||||||
if let accessibleValueFormat = accessibilityValueFormat, let accessibleIndex = ordinalFormatter.string(from: NSNumber(value: i + 1)) {
|
if let accessibleValueFormat = accessibilityValueFormat, let accessibleIndex = ordinalFormatter.string(from: NSNumber(value: i + 1)) {
|
||||||
bar.accessibilityLabel = String(format: accessibleValueFormat, accessibleIndex, numberOfPages)
|
bar.accessibilityLabel = String(format: accessibleValueFormat, accessibleIndex, numberOfPages)
|
||||||
}
|
}
|
||||||
bar.accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "AccTabHint")
|
bar.accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "AccTabHint")
|
||||||
|
bar.accessibilityTraits = .button
|
||||||
bar.widthAnchor.constraint(equalToConstant: BarsIndicatorView.indicatorBarWidth).isActive = true
|
bar.widthAnchor.constraint(equalToConstant: BarsIndicatorView.indicatorBarWidth).isActive = true
|
||||||
bar.backgroundColor = isEnabled ? (i == currentIndex ? currentIndicatorColor : indicatorColor) : disabledIndicatorColor
|
bar.backgroundColor = isEnabled ? (i == currentIndex ? currentIndicatorColor : indicatorColor) : disabledIndicatorColor
|
||||||
let barHeight = i == currentIndex ? BarsIndicatorView.indicatorBarHeight.selected : BarsIndicatorView.indicatorBarHeight.unselected
|
let barHeight = i == currentIndex ? BarsIndicatorView.indicatorBarHeight.selected : BarsIndicatorView.indicatorBarHeight.unselected
|
||||||
|
|||||||
@ -215,9 +215,9 @@ public typealias ActionBlockConfirmation = () -> (Bool)
|
|||||||
super.setupView()
|
super.setupView()
|
||||||
|
|
||||||
isAccessibilityElement = true
|
isAccessibilityElement = true
|
||||||
accessibilityTraits = .button
|
|
||||||
accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "AccToggleHint")
|
accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "AccToggleHint")
|
||||||
accessibilityLabel = MVMCoreUIUtility.hardcodedString(withKey: "Toggle_buttonlabel")
|
accessibilityLabel = MVMCoreUIUtility.hardcodedString(withKey: "Toggle_buttonlabel")
|
||||||
|
accessibilityTraits = .button
|
||||||
|
|
||||||
heightConstraint = heightAnchor.constraint(equalToConstant: Self.containerSize.height)
|
heightConstraint = heightAnchor.constraint(equalToConstant: Self.containerSize.height)
|
||||||
heightConstraint?.isActive = true
|
heightConstraint?.isActive = true
|
||||||
|
|||||||
@ -173,6 +173,7 @@ import Foundation
|
|||||||
MoleculeObjectMapping.shared()?.register(viewClass: ListLeftVariableCheckboxBodyText.self, viewModelClass: ListLeftVariableCheckboxBodyTextModel.self)
|
MoleculeObjectMapping.shared()?.register(viewClass: ListLeftVariableCheckboxBodyText.self, viewModelClass: ListLeftVariableCheckboxBodyTextModel.self)
|
||||||
MoleculeObjectMapping.shared()?.register(viewClass: ListLeftVariableIconAllTextLinks.self, viewModelClass: ListLeftVariableIconAllTextLinksModel.self)
|
MoleculeObjectMapping.shared()?.register(viewClass: ListLeftVariableIconAllTextLinks.self, viewModelClass: ListLeftVariableIconAllTextLinksModel.self)
|
||||||
MoleculeObjectMapping.shared()?.register(viewClass: ListLeftVariableNumberedListAllTextAndLinks.self, viewModelClass: ListLeftVariableNumberedListAllTextAndLinksModel.self)
|
MoleculeObjectMapping.shared()?.register(viewClass: ListLeftVariableNumberedListAllTextAndLinks.self, viewModelClass: ListLeftVariableNumberedListAllTextAndLinksModel.self)
|
||||||
|
MoleculeObjectMapping.shared()?.register(viewClass: ListLeftVariableNumberedListBodyText.self, viewModelClass: ListLeftVariableNumberedListBodyTextModel.self)
|
||||||
MoleculeObjectMapping.shared()?.register(viewClass: ListRVWheel.self, viewModelClass: ListRVWheelModel.self)
|
MoleculeObjectMapping.shared()?.register(viewClass: ListRVWheel.self, viewModelClass: ListRVWheelModel.self)
|
||||||
MoleculeObjectMapping.shared()?.register(viewClass: ListRightVariablePayments.self, viewModelClass: ListRightVariablePaymentsModel.self)
|
MoleculeObjectMapping.shared()?.register(viewClass: ListRightVariablePayments.self, viewModelClass: ListRightVariablePaymentsModel.self)
|
||||||
MoleculeObjectMapping.shared()?.register(viewClass: ListRightVariableTotalData.self, viewModelClass: ListRightVariableTotalDataModel.self)
|
MoleculeObjectMapping.shared()?.register(viewClass: ListRightVariableTotalData.self, viewModelClass: ListRightVariableTotalDataModel.self)
|
||||||
|
|||||||
@ -58,10 +58,8 @@ import Foundation
|
|||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
verticalStack.restack()
|
verticalStack.restack()
|
||||||
isAccessibilityElement = true
|
|
||||||
accessibilityTraits = button.accessibilityTraits
|
|
||||||
accessibilityHint = button.accessibilityHint
|
accessibilityHint = button.accessibilityHint
|
||||||
updateAccessibilityLabel()
|
accessibilityTraits = button.accessibilityTraits
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -100,10 +98,8 @@ import Foundation
|
|||||||
// MARK: - Accessibility
|
// MARK: - Accessibility
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func getAccessibilityMessage() -> String? {
|
||||||
|
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let eyebrowText = eyebrow.text, !eyebrowText.isEmpty {
|
if let eyebrowText = eyebrow.text, !eyebrowText.isEmpty {
|
||||||
message += eyebrowText + ", "
|
message += eyebrowText + ", "
|
||||||
}
|
}
|
||||||
@ -120,11 +116,28 @@ import Foundation
|
|||||||
message += body2Text + ", "
|
message += body2Text + ", "
|
||||||
}
|
}
|
||||||
|
|
||||||
if let rightImageViewText = rightImageView.accessibilityLabel, !rightImageViewText.isEmpty {
|
if let rightImageViewText = rightImageView.imageView.accessibilityLabel, !rightImageViewText.isEmpty {
|
||||||
message += rightImageViewText
|
message += rightImageViewText
|
||||||
}
|
}
|
||||||
|
return message.count > 0 ? message : nil
|
||||||
|
}
|
||||||
|
|
||||||
accessibilityLabel = message
|
func updateAccessibilityLabel() {
|
||||||
|
if let accessoryView = accessoryView {
|
||||||
|
// Both caret and button. Read all content on caret.
|
||||||
|
isAccessibilityElement = false
|
||||||
|
accessoryView.accessibilityLabel = getAccessibilityMessage()
|
||||||
|
accessibilityElements = [accessoryView, button]
|
||||||
|
} else {
|
||||||
|
// Make whole cell focusable if no action.
|
||||||
|
isAccessibilityElement = true
|
||||||
|
if let message = getAccessibilityMessage(),
|
||||||
|
let buttonTitle = button.titleLabel?.text {
|
||||||
|
accessibilityLabel = message + ", " + buttonTitle
|
||||||
|
} else {
|
||||||
|
accessibilityLabel = getAccessibilityMessage()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func accessibilityActivate() -> Bool {
|
open override func accessibilityActivate() -> Bool {
|
||||||
|
|||||||
@ -58,10 +58,8 @@ import Foundation
|
|||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
verticalStack.restack()
|
verticalStack.restack()
|
||||||
isAccessibilityElement = true
|
|
||||||
accessibilityTraits = button.accessibilityTraits
|
|
||||||
accessibilityHint = button.accessibilityHint
|
accessibilityHint = button.accessibilityHint
|
||||||
updateAccessibilityLabel()
|
accessibilityTraits = button.accessibilityTraits
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -100,10 +98,8 @@ import Foundation
|
|||||||
// MARK: - Accessibility
|
// MARK: - Accessibility
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func getAccessibilityMessage() -> String? {
|
||||||
|
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let eyebrowText = eyebrow.text, !eyebrowText.isEmpty {
|
if let eyebrowText = eyebrow.text, !eyebrowText.isEmpty {
|
||||||
message += eyebrowText + ", "
|
message += eyebrowText + ", "
|
||||||
}
|
}
|
||||||
@ -120,11 +116,28 @@ import Foundation
|
|||||||
message += body2Text + ", "
|
message += body2Text + ", "
|
||||||
}
|
}
|
||||||
|
|
||||||
if let rightImageViewText = rightImageView.accessibilityLabel, !rightImageViewText.isEmpty {
|
if let rightImageViewText = rightImageView.imageView.accessibilityLabel, !rightImageViewText.isEmpty {
|
||||||
message += rightImageViewText
|
message += rightImageViewText
|
||||||
}
|
}
|
||||||
|
return message.count > 0 ? message : nil
|
||||||
|
}
|
||||||
|
|
||||||
accessibilityLabel = message
|
func updateAccessibilityLabel() {
|
||||||
|
if let accessoryView = accessoryView {
|
||||||
|
// Both caret and button. Read all content on caret.
|
||||||
|
isAccessibilityElement = false
|
||||||
|
accessoryView.accessibilityLabel = getAccessibilityMessage()
|
||||||
|
accessibilityElements = [accessoryView, button]
|
||||||
|
} else {
|
||||||
|
// Make whole cell focusable if no action.
|
||||||
|
isAccessibilityElement = true
|
||||||
|
if let message = getAccessibilityMessage(),
|
||||||
|
let buttonTitle = button.titleLabel?.text {
|
||||||
|
accessibilityLabel = message + ", " + buttonTitle
|
||||||
|
} else {
|
||||||
|
accessibilityLabel = getAccessibilityMessage()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func accessibilityActivate() -> Bool {
|
open override func accessibilityActivate() -> Bool {
|
||||||
|
|||||||
@ -114,7 +114,7 @@ import Foundation
|
|||||||
message += body2Text + ", "
|
message += body2Text + ", "
|
||||||
}
|
}
|
||||||
|
|
||||||
if let rightImageLabel = rightImage.accessibilityLabel, !rightImageLabel.isEmpty {
|
if let rightImageLabel = rightImage.imageView.accessibilityLabel, !rightImageLabel.isEmpty {
|
||||||
message += rightImageLabel
|
message += rightImageLabel
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,8 +145,8 @@ import Foundation
|
|||||||
views.append(twoLinkView.leftLink)
|
views.append(twoLinkView.leftLink)
|
||||||
views.append(twoLinkView.rightLink)
|
views.append(twoLinkView.rightLink)
|
||||||
|
|
||||||
if let rightImageLabel = rightImage.accessibilityLabel, !rightImageLabel.isEmpty {
|
if let rightImageLabel = rightImage.imageView.accessibilityLabel, !rightImageLabel.isEmpty {
|
||||||
views.append(rightImage)
|
views.append(rightImage.imageView)
|
||||||
}
|
}
|
||||||
|
|
||||||
accessibilityElements = views
|
accessibilityElements = views
|
||||||
|
|||||||
@ -111,7 +111,7 @@ import Foundation
|
|||||||
message += body2Text + ", "
|
message += body2Text + ", "
|
||||||
}
|
}
|
||||||
|
|
||||||
if let rightImageLabel = rightImage.accessibilityLabel, !rightImageLabel.isEmpty {
|
if let rightImageLabel = rightImage.imageView.accessibilityLabel, !rightImageLabel.isEmpty {
|
||||||
message += rightImageLabel
|
message += rightImageLabel
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,8 +142,8 @@ import Foundation
|
|||||||
views.append(twoLinkView.leftLink)
|
views.append(twoLinkView.leftLink)
|
||||||
views.append(twoLinkView.rightLink)
|
views.append(twoLinkView.rightLink)
|
||||||
|
|
||||||
if let rightImageLabel = rightImage.accessibilityLabel, !rightImageLabel.isEmpty {
|
if let rightImageLabel = rightImage.imageView.accessibilityLabel, !rightImageLabel.isEmpty {
|
||||||
views.append(rightImage)
|
views.append(rightImage.imageView)
|
||||||
}
|
}
|
||||||
|
|
||||||
accessibilityElements = views
|
accessibilityElements = views
|
||||||
|
|||||||
@ -54,8 +54,6 @@ import Foundation
|
|||||||
arrow.pinHeightAndWidth()
|
arrow.pinHeightAndWidth()
|
||||||
arrowAndLabel2Stack.restack()
|
arrowAndLabel2Stack.restack()
|
||||||
stack.restack()
|
stack.restack()
|
||||||
isAccessibilityElement = true
|
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------
|
//-----------------------------------------------------
|
||||||
@ -92,7 +90,7 @@ import Foundation
|
|||||||
//-----------------------------------------------------
|
//-----------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let label1Text = label1.text, !label1Text.isEmpty {
|
if let label1Text = label1.text, !label1Text.isEmpty {
|
||||||
|
|||||||
@ -49,11 +49,9 @@ import Foundation
|
|||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
|
|
||||||
isAccessibilityElement = true
|
|
||||||
checkbox.isAccessibilityElement = false
|
|
||||||
accessibilityTraits = checkbox.accessibilityTraits
|
|
||||||
accessibilityHint = checkbox.accessibilityHint
|
accessibilityHint = checkbox.accessibilityHint
|
||||||
// Update accessibility label on radio button state change.
|
accessibilityTraits = checkbox.accessibilityTraits
|
||||||
|
// Update accessibility label on checkbox state change.
|
||||||
observation = observe(\.checkbox.isSelected, options: [.new]) { [weak self] _, _ in
|
observation = observe(\.checkbox.isSelected, options: [.new]) { [weak self] _, _ in
|
||||||
self?.updateAccessibilityLabel()
|
self?.updateAccessibilityLabel()
|
||||||
}
|
}
|
||||||
@ -92,41 +90,19 @@ import Foundation
|
|||||||
message += checkboxLabel + ", "
|
message += checkboxLabel + ", "
|
||||||
}
|
}
|
||||||
|
|
||||||
if let eyebrowLabel = eyebrowHeadlineBodyLink.eyebrow.text, !eyebrowLabel.isEmpty {
|
if let label = eyebrowHeadlineBodyLink.getAccessibilityMessage() {
|
||||||
message += eyebrowLabel + ", "
|
message += label
|
||||||
}
|
|
||||||
|
|
||||||
if let headlineLabel = eyebrowHeadlineBodyLink.headline.text, !headlineLabel.isEmpty {
|
|
||||||
message += headlineLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let bodyLabel = eyebrowHeadlineBodyLink.body.text, !bodyLabel.isEmpty {
|
|
||||||
message += bodyLabel
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
||||||
|
|
||||||
isAccessibilityElement = !linkShowing
|
isAccessibilityElement = !linkShowing
|
||||||
checkbox.isAccessibilityElement = linkShowing
|
|
||||||
eyebrowHeadlineBodyLink.link.isAccessibilityElement = linkShowing
|
|
||||||
|
|
||||||
if !linkShowing {
|
if !linkShowing {
|
||||||
// Make whole cell focusable if no link.
|
// Make whole cell focusable if no link.
|
||||||
accessibilityLabel = message
|
accessibilityLabel = message
|
||||||
} else {
|
} else {
|
||||||
// Allow only radio button and link to be focused on.
|
// Allow only checkbox and link to be focused on.
|
||||||
checkbox.accessibilityLabel = message
|
checkbox.accessibilityLabel = message
|
||||||
var elements: [UIView] = []
|
accessibilityElements = [checkbox, eyebrowHeadlineBodyLink.link]
|
||||||
|
|
||||||
if message.count > 0 {
|
|
||||||
elements.append(checkbox)
|
|
||||||
}
|
|
||||||
|
|
||||||
if linkShowing {
|
|
||||||
elements.append(eyebrowHeadlineBodyLink.link)
|
|
||||||
}
|
|
||||||
|
|
||||||
accessibilityElements = elements
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -49,10 +49,9 @@ import Foundation
|
|||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
isAccessibilityElement = true
|
isAccessibilityElement = true
|
||||||
checkbox.isAccessibilityElement = false
|
|
||||||
accessibilityTraits = checkbox.accessibilityTraits
|
|
||||||
accessibilityHint = checkbox.accessibilityHint
|
accessibilityHint = checkbox.accessibilityHint
|
||||||
// Update accessibility label on radio button state change.
|
accessibilityTraits = checkbox.accessibilityTraits
|
||||||
|
// Update accessibility label on checkbox state change.
|
||||||
observation = observe(\.checkbox.isSelected, options: [.new]) { [weak self] _, _ in
|
observation = observe(\.checkbox.isSelected, options: [.new]) { [weak self] _, _ in
|
||||||
self?.updateAccessibilityLabel()
|
self?.updateAccessibilityLabel()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -42,7 +42,6 @@ import Foundation
|
|||||||
leftImage.imageView.contentMode = .scaleAspectFit
|
leftImage.imageView.contentMode = .scaleAspectFit
|
||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -63,57 +62,37 @@ import Foundation
|
|||||||
return 140
|
return 140
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getAccessibilityMessage() -> String? {
|
||||||
|
guard let leftImageLabel = leftImage.imageView.accessibilityLabel else {
|
||||||
|
return eyebrowHeadlineBodyLink.getAccessibilityMessage()
|
||||||
|
}
|
||||||
|
guard let label = eyebrowHeadlineBodyLink.getAccessibilityMessage() else {
|
||||||
|
return leftImageLabel
|
||||||
|
}
|
||||||
|
return leftImageLabel + ", " + label
|
||||||
|
}
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
|
||||||
var message = ""
|
|
||||||
|
|
||||||
if let leftImageLabel = leftImage.accessibilityLabel {
|
|
||||||
message += leftImageLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let eyebrowLabel = eyebrowHeadlineBodyLink.eyebrow.text {
|
|
||||||
message += eyebrowLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let headlineLabel = eyebrowHeadlineBodyLink.headline.text {
|
|
||||||
message += headlineLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let bodyLabel = eyebrowHeadlineBodyLink.body.text {
|
|
||||||
message += bodyLabel
|
|
||||||
}
|
|
||||||
|
|
||||||
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
||||||
isAccessibilityElement = !linkShowing
|
isAccessibilityElement = !linkShowing
|
||||||
eyebrowHeadlineBodyLink.link.isAccessibilityElement = linkShowing
|
accessibilityTraits = (isAccessibilityElement && accessoryView != nil) ? .button : .none
|
||||||
|
|
||||||
if !linkShowing {
|
if !linkShowing {
|
||||||
// Make whole cell focusable if no link.
|
// Make whole cell focusable if no link.
|
||||||
accessibilityLabel = message
|
accessibilityLabel = getAccessibilityMessage()
|
||||||
|
} else if let accessoryView = accessoryView {
|
||||||
|
// Both caret and link. Read all content on caret.
|
||||||
|
accessoryView.accessibilityLabel = getAccessibilityMessage()
|
||||||
|
accessibilityElements = [accessoryView, eyebrowHeadlineBodyLink.link]
|
||||||
} else {
|
} else {
|
||||||
// Allow only radio button and link to be focused on.
|
// Only link. Manually add accessibility elements to ensure they are read in the right order.
|
||||||
var elements: [UIView] = []
|
var elements: [Any] = []
|
||||||
|
if let leftImageLabel = leftImage.imageView.accessibilityLabel, !leftImageLabel.isEmpty {
|
||||||
if let leftImageLabel = leftImage.accessibilityLabel, !leftImageLabel.isEmpty {
|
elements.append(leftImage.imageView)
|
||||||
elements.append(leftImage)
|
|
||||||
}
|
}
|
||||||
|
if let otherElements = eyebrowHeadlineBodyLink.getAccessibilityElements() {
|
||||||
if let eyeBrowText = eyebrowHeadlineBodyLink.eyebrow.text, !eyeBrowText.isEmpty {
|
elements.append(otherElements)
|
||||||
elements.append(eyebrowHeadlineBodyLink.eyebrow)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let headlineText = eyebrowHeadlineBodyLink.headline.text, !headlineText.isEmpty {
|
|
||||||
elements.append(eyebrowHeadlineBodyLink.headline)
|
|
||||||
}
|
|
||||||
|
|
||||||
if let bodyText = eyebrowHeadlineBodyLink.body.text, !bodyText.isEmpty {
|
|
||||||
elements.append(eyebrowHeadlineBodyLink.body)
|
|
||||||
}
|
|
||||||
|
|
||||||
if linkShowing {
|
|
||||||
elements.append(eyebrowHeadlineBodyLink.link)
|
|
||||||
}
|
|
||||||
|
|
||||||
accessibilityElements = elements
|
accessibilityElements = elements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -48,8 +48,6 @@ import UIKit
|
|||||||
rightLabel.setContentHuggingPriority(UILayoutPriority(rawValue: 902), for: .horizontal)
|
rightLabel.setContentHuggingPriority(UILayoutPriority(rawValue: 902), for: .horizontal)
|
||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
isAccessibilityElement = true
|
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -78,10 +76,10 @@ import UIKit
|
|||||||
}
|
}
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let leftImageLabel = leftImage.accessibilityLabel {
|
if let leftImageLabel = leftImage.imageView.accessibilityLabel {
|
||||||
message += leftImageLabel + ", "
|
message += leftImageLabel + ", "
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,5 +92,6 @@ import UIKit
|
|||||||
}
|
}
|
||||||
|
|
||||||
accessibilityLabel = message
|
accessibilityLabel = message
|
||||||
|
accessibilityTraits = (accessoryView != nil) ? .button : .none
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -58,10 +58,8 @@ import Foundation
|
|||||||
rightLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 900), for: .horizontal)
|
rightLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 900), for: .horizontal)
|
||||||
rightLabel.setContentHuggingPriority(UILayoutPriority(rawValue: 900), for: .horizontal)
|
rightLabel.setContentHuggingPriority(UILayoutPriority(rawValue: 900), for: .horizontal)
|
||||||
rightLabel.numberOfLines = 1
|
rightLabel.numberOfLines = 1
|
||||||
isAccessibilityElement = true
|
|
||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -93,10 +91,10 @@ import Foundation
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let leftImageLabel = leftImage.accessibilityLabel {
|
if let leftImageLabel = leftImage.imageView.accessibilityLabel {
|
||||||
message += leftImageLabel + ", "
|
message += leftImageLabel + ", "
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,5 +111,6 @@ import Foundation
|
|||||||
}
|
}
|
||||||
|
|
||||||
accessibilityLabel = message
|
accessibilityLabel = message
|
||||||
|
accessibilityTraits = (accessoryView != nil) ? .button : .none
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,10 +37,11 @@ import Foundation
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
override open func setupView() {
|
override open func setupView() {
|
||||||
super.setupView()
|
super.setupView()
|
||||||
|
leftLabel.setContentCompressionResistancePriority(.required, for: .horizontal)
|
||||||
|
leftLabel.setContentHuggingPriority(.defaultHigh, for: .vertical)
|
||||||
leftLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
leftLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------
|
//---------------------------------------------------
|
||||||
@ -66,66 +67,41 @@ import Foundation
|
|||||||
leftLabel.setFontStyle(.Title2XLarge)
|
leftLabel.setFontStyle(.Title2XLarge)
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func layoutSubviews() {
|
|
||||||
super.layoutSubviews()
|
|
||||||
// This fixes a defect body text where it doesn't layout correctly.
|
|
||||||
eyebrowHeadlineBodyLink.body.preferredMaxLayoutWidth = eyebrowHeadlineBodyLink.frame.width
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Accessibility
|
// MARK: - Accessibility
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
func getAccessibilityMessage() -> String? {
|
||||||
|
guard let leftLabel = leftLabel.text else {
|
||||||
|
return eyebrowHeadlineBodyLink.getAccessibilityMessage()
|
||||||
|
}
|
||||||
|
guard let label = eyebrowHeadlineBodyLink.getAccessibilityMessage() else {
|
||||||
|
return leftLabel
|
||||||
|
}
|
||||||
|
return leftLabel + ", " + label
|
||||||
|
}
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
|
||||||
var message = ""
|
|
||||||
|
|
||||||
if let leftLabel = leftLabel.text {
|
|
||||||
message += leftLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let eyebrowLabel = eyebrowHeadlineBodyLink.eyebrow.text {
|
|
||||||
message += eyebrowLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let headlineLabel = eyebrowHeadlineBodyLink.headline.text {
|
|
||||||
message += headlineLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let bodyLabel = eyebrowHeadlineBodyLink.body.text {
|
|
||||||
message += bodyLabel
|
|
||||||
}
|
|
||||||
|
|
||||||
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
||||||
isAccessibilityElement = !linkShowing
|
isAccessibilityElement = !linkShowing
|
||||||
eyebrowHeadlineBodyLink.link.isAccessibilityElement = linkShowing
|
accessibilityTraits = (isAccessibilityElement && accessoryView != nil) ? .button : .none
|
||||||
|
|
||||||
if !linkShowing {
|
if !linkShowing {
|
||||||
// Make whole cell focusable if no link.
|
// Make whole cell focusable if no link.
|
||||||
accessibilityLabel = message
|
accessibilityLabel = getAccessibilityMessage()
|
||||||
|
} else if let accessoryView = accessoryView {
|
||||||
|
// Both caret and link. Read all content on caret.
|
||||||
|
accessoryView.accessibilityLabel = getAccessibilityMessage()
|
||||||
|
accessibilityElements = [accessoryView, eyebrowHeadlineBodyLink.link]
|
||||||
} else {
|
} else {
|
||||||
var elements: [UIView] = []
|
// Only link. Manually add accessibility elements to ensure they are read in the right order.
|
||||||
|
var elements: [Any] = []
|
||||||
if let leftLabelText = leftLabel.text, !leftLabelText.isEmpty {
|
if let leftLabelText = leftLabel.text, !leftLabelText.isEmpty {
|
||||||
elements.append(leftLabel)
|
elements.append(leftLabel)
|
||||||
}
|
}
|
||||||
|
if let otherElements = eyebrowHeadlineBodyLink.getAccessibilityElements() {
|
||||||
if let eyeBrowText = eyebrowHeadlineBodyLink.eyebrow.text, !eyeBrowText.isEmpty {
|
elements.append(otherElements)
|
||||||
elements.append(eyebrowHeadlineBodyLink.eyebrow)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let headlineText = eyebrowHeadlineBodyLink.headline.text, !headlineText.isEmpty {
|
|
||||||
elements.append(eyebrowHeadlineBodyLink.headline)
|
|
||||||
}
|
|
||||||
|
|
||||||
if let bodyText = eyebrowHeadlineBodyLink.body.text, !bodyText.isEmpty {
|
|
||||||
elements.append(eyebrowHeadlineBodyLink.body)
|
|
||||||
}
|
|
||||||
|
|
||||||
if linkShowing {
|
|
||||||
elements.append(eyebrowHeadlineBodyLink.link)
|
|
||||||
}
|
|
||||||
|
|
||||||
accessibilityElements = elements
|
accessibilityElements = elements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,95 @@
|
|||||||
|
//
|
||||||
|
// ListLeftVariableNumberedListBodyText.swift
|
||||||
|
// MVMCoreUI
|
||||||
|
//
|
||||||
|
// Created by Subhankar Acharya on 12/06/20.
|
||||||
|
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
@objcMembers open class ListLeftVariableNumberedListBodyText: TableViewCell {
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Outlets
|
||||||
|
//-----------------------------------------------------
|
||||||
|
public let leftLabel = Label(fontStyle: .Title2XLarge)
|
||||||
|
public let headlineBody = HeadlineBody()
|
||||||
|
public var stack: Stack<StackModel>
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Initializers
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
||||||
|
|
||||||
|
stack = Stack<StackModel>.createStack(with: [(view: leftLabel, model: StackItemModel(horizontalAlignment: .fill)),
|
||||||
|
(view: headlineBody, model: StackItemModel(horizontalAlignment: .leading))],
|
||||||
|
axis: .horizontal)
|
||||||
|
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
||||||
|
}
|
||||||
|
|
||||||
|
public required init?(coder aDecoder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Life Cycle
|
||||||
|
//--------------------------------------------------
|
||||||
|
override open func setupView() {
|
||||||
|
super.setupView()
|
||||||
|
leftLabel.setContentCompressionResistancePriority(.required, for: .horizontal)
|
||||||
|
leftLabel.setContentHuggingPriority(.defaultHigh, for: .vertical)
|
||||||
|
leftLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
||||||
|
addMolecule(stack)
|
||||||
|
stack.restack()
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------
|
||||||
|
// MARK: - Molecule
|
||||||
|
//---------------------------------------------------
|
||||||
|
|
||||||
|
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
|
||||||
|
super.set(with: model, delegateObject, additionalData)
|
||||||
|
|
||||||
|
guard let model = model as? ListLeftVariableNumberedListBodyTextModel else { return }
|
||||||
|
leftLabel.text = String(model.number)
|
||||||
|
headlineBody.set(with: model.headlineBody, delegateObject, additionalData)
|
||||||
|
updateAccessibilityLabel()
|
||||||
|
}
|
||||||
|
|
||||||
|
open override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? {
|
||||||
|
return 140
|
||||||
|
}
|
||||||
|
|
||||||
|
open override func reset() {
|
||||||
|
super.reset()
|
||||||
|
leftLabel.setFontStyle(.Title2XLarge)
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Accessibility
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
func updateAccessibilityLabel() {
|
||||||
|
|
||||||
|
isAccessibilityElement = true
|
||||||
|
|
||||||
|
var message = ""
|
||||||
|
|
||||||
|
if let leftLabel = leftLabel.text {
|
||||||
|
message += leftLabel + ", "
|
||||||
|
}
|
||||||
|
|
||||||
|
if let headlineLabel = headlineBody.headlineLabel.text {
|
||||||
|
message += headlineLabel + ", "
|
||||||
|
}
|
||||||
|
|
||||||
|
if let messageLabel = headlineBody.messageLabel.text {
|
||||||
|
message += messageLabel
|
||||||
|
}
|
||||||
|
|
||||||
|
accessibilityLabel = message
|
||||||
|
accessibilityTraits = (accessoryView != nil) ? .button : .none
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
//
|
||||||
|
// ListLeftVariableNumberedListBodyTextModel.swift
|
||||||
|
// MVMCoreUI
|
||||||
|
//
|
||||||
|
// Created by Subhankar Acharya on 12/06/20.
|
||||||
|
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
public class ListLeftVariableNumberedListBodyTextModel: ListItemModel, MoleculeModelProtocol {
|
||||||
|
//-----------------------------------------------------
|
||||||
|
// MARK: - Properties
|
||||||
|
//-----------------------------------------------------
|
||||||
|
|
||||||
|
public static var identifier: String = "listLVNLBdy"
|
||||||
|
public var number: Int
|
||||||
|
public var headlineBody: HeadlineBodyModel
|
||||||
|
|
||||||
|
//-----------------------------------------------------
|
||||||
|
// MARK: - Initializer
|
||||||
|
//-----------------------------------------------------
|
||||||
|
|
||||||
|
public init(number: Int, headlineBody: HeadlineBodyModel) {
|
||||||
|
self.number = number
|
||||||
|
self.headlineBody = headlineBody
|
||||||
|
super.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------
|
||||||
|
// MARK: - Keys
|
||||||
|
//-----------------------------------------------------
|
||||||
|
|
||||||
|
private enum CodingKeys: String, CodingKey {
|
||||||
|
case moleculeName
|
||||||
|
case number
|
||||||
|
case headlineBody
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------
|
||||||
|
// MARK: - Codec
|
||||||
|
//-----------------------------------------------------
|
||||||
|
|
||||||
|
required public init(from decoder: Decoder) throws {
|
||||||
|
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
|
number = try typeContainer.decode(Int.self, forKey: .number)
|
||||||
|
headlineBody = try typeContainer.decode(HeadlineBodyModel.self, forKey: .headlineBody)
|
||||||
|
try super.init(from: decoder)
|
||||||
|
}
|
||||||
|
|
||||||
|
public override func encode(to encoder: Encoder) throws {
|
||||||
|
try super.encode(to: encoder)
|
||||||
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||||
|
try container.encode(moleculeName, forKey: .moleculeName)
|
||||||
|
try container.encode(number, forKey: .number)
|
||||||
|
try container.encode(headlineBody, forKey: .headlineBody)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -89,41 +89,19 @@ import Foundation
|
|||||||
message += radioButtonLabel + ", "
|
message += radioButtonLabel + ", "
|
||||||
}
|
}
|
||||||
|
|
||||||
if let eyebrowLabel = eyebrowHeadlineBodyLink.eyebrow.text {
|
if let label = eyebrowHeadlineBodyLink.getAccessibilityMessage() {
|
||||||
message += eyebrowLabel + ", "
|
message += label
|
||||||
}
|
|
||||||
|
|
||||||
if let headlineLabel = eyebrowHeadlineBodyLink.headline.text {
|
|
||||||
message += headlineLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let bodyLabel = eyebrowHeadlineBodyLink.body.text {
|
|
||||||
message += bodyLabel
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
||||||
isAccessibilityElement = !linkShowing
|
isAccessibilityElement = !linkShowing
|
||||||
radioButton.isAccessibilityElement = linkShowing
|
|
||||||
eyebrowHeadlineBodyLink.link.isAccessibilityElement = linkShowing
|
|
||||||
|
|
||||||
if !linkShowing {
|
if !linkShowing {
|
||||||
// Make whole cell focusable if no link.
|
// Make whole cell focusable if no link.
|
||||||
accessibilityLabel = message
|
accessibilityLabel = message
|
||||||
} else {
|
} else {
|
||||||
// Allow only radio button and link to be focused on.
|
// Allow only radio button and link to be focused on.
|
||||||
radioButton.accessibilityLabel = message
|
radioButton.accessibilityLabel = message
|
||||||
|
accessibilityElements = [radioButton, eyebrowHeadlineBodyLink.link]
|
||||||
var elements: [UIView] = []
|
|
||||||
|
|
||||||
if !message.isEmpty {
|
|
||||||
elements.append(radioButton)
|
|
||||||
}
|
|
||||||
|
|
||||||
if linkShowing {
|
|
||||||
elements.append(eyebrowHeadlineBodyLink.link)
|
|
||||||
}
|
|
||||||
|
|
||||||
accessibilityElements = elements
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -50,8 +50,8 @@ import UIKit
|
|||||||
eyebrowHeadlineBodyLink.body.textColor = .mvmOrangeAA
|
eyebrowHeadlineBodyLink.body.textColor = .mvmOrangeAA
|
||||||
eyebrowHeadlineBodyLink.headline.setFontStyle(.BoldBodySmall)
|
eyebrowHeadlineBodyLink.headline.setFontStyle(.BoldBodySmall)
|
||||||
|
|
||||||
accessibilityTraits = radioButton.accessibilityTraits
|
|
||||||
accessibilityHint = radioButton.accessibilityHint
|
accessibilityHint = radioButton.accessibilityHint
|
||||||
|
accessibilityTraits = radioButton.accessibilityTraits
|
||||||
|
|
||||||
// Update accessibility label on radio button state change.
|
// Update accessibility label on radio button state change.
|
||||||
observation = observe(\.radioButton.isSelected, options: [.new]) { [weak self] _, _ in
|
observation = observe(\.radioButton.isSelected, options: [.new]) { [weak self] _, _ in
|
||||||
@ -103,44 +103,23 @@ import UIKit
|
|||||||
message += radioButtonLabel + ", "
|
message += radioButtonLabel + ", "
|
||||||
}
|
}
|
||||||
|
|
||||||
if let leftImageLabel = leftImage.accessibilityLabel {
|
if let leftImageLabel = leftImage.imageView.accessibilityLabel {
|
||||||
message += leftImageLabel + ", "
|
message += leftImageLabel + ", "
|
||||||
}
|
}
|
||||||
|
|
||||||
if let eyebrowLabel = eyebrowHeadlineBodyLink.eyebrow.text {
|
if let label = eyebrowHeadlineBodyLink.getAccessibilityMessage() {
|
||||||
message += eyebrowLabel + ", "
|
message += label
|
||||||
}
|
|
||||||
|
|
||||||
if let headlineLabel = eyebrowHeadlineBodyLink.headline.text {
|
|
||||||
message += headlineLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let bodyLabel = eyebrowHeadlineBodyLink.body.text {
|
|
||||||
message += bodyLabel
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
||||||
isAccessibilityElement = !linkShowing
|
isAccessibilityElement = !linkShowing
|
||||||
radioButton.isAccessibilityElement = linkShowing
|
|
||||||
eyebrowHeadlineBodyLink.link.isAccessibilityElement = linkShowing
|
|
||||||
|
|
||||||
if !linkShowing {
|
if !linkShowing {
|
||||||
// Make whole cell focusable if no link.
|
// Make whole cell focusable if no link.
|
||||||
accessibilityLabel = message
|
accessibilityLabel = message
|
||||||
} else {
|
} else {
|
||||||
// Allow only radio button and link to be focused on.
|
// Allow only radio button and link to be focused on.
|
||||||
radioButton.accessibilityLabel = message
|
radioButton.accessibilityLabel = message
|
||||||
var elements: [UIView] = []
|
accessibilityElements = [radioButton, eyebrowHeadlineBodyLink.link]
|
||||||
|
|
||||||
if !message.isEmpty {
|
|
||||||
elements.append(radioButton)
|
|
||||||
}
|
|
||||||
|
|
||||||
if linkShowing {
|
|
||||||
elements.append(eyebrowHeadlineBodyLink.link)
|
|
||||||
}
|
|
||||||
|
|
||||||
accessibilityElements = elements
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -47,9 +47,8 @@ open class ListLeftVariableRadioButtonBodyText: TableViewCell {
|
|||||||
|
|
||||||
// Make the whole cell focusable.
|
// Make the whole cell focusable.
|
||||||
isAccessibilityElement = true
|
isAccessibilityElement = true
|
||||||
radioButton.isAccessibilityElement = false
|
|
||||||
accessibilityTraits = radioButton.accessibilityTraits
|
|
||||||
accessibilityHint = radioButton.accessibilityHint
|
accessibilityHint = radioButton.accessibilityHint
|
||||||
|
accessibilityTraits = radioButton.accessibilityTraits
|
||||||
updateAccessibilityLabel()
|
updateAccessibilityLabel()
|
||||||
|
|
||||||
// Update accessibility label on radio button state change.
|
// Update accessibility label on radio button state change.
|
||||||
|
|||||||
@ -78,8 +78,6 @@ import Foundation
|
|||||||
stack.restack()
|
stack.restack()
|
||||||
horizontalStack.restack()
|
horizontalStack.restack()
|
||||||
labelStack.restack()
|
labelStack.restack()
|
||||||
isAccessibilityElement = true
|
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------
|
//------------------------------------------------------
|
||||||
@ -115,7 +113,7 @@ import Foundation
|
|||||||
//------------------------------------------------------
|
//------------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let leftHeadlineText = leftHeadline.text {
|
if let leftHeadlineText = leftHeadline.text {
|
||||||
@ -135,5 +133,6 @@ import Foundation
|
|||||||
}
|
}
|
||||||
|
|
||||||
accessibilityLabel = message
|
accessibilityLabel = message
|
||||||
|
accessibilityTraits = (accessoryView != nil) ? .button : .none
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -43,7 +43,6 @@ import Foundation
|
|||||||
super.setupView()
|
super.setupView()
|
||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
|
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
|
||||||
@ -72,8 +71,7 @@ import Foundation
|
|||||||
// MARK: - Accessibility
|
// MARK: - Accessibility
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func getAccessibilityMessage() -> String? {
|
||||||
|
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let eyebrowLabel = eyebrow.text, !eyebrowLabel.isEmpty {
|
if let eyebrowLabel = eyebrow.text, !eyebrowLabel.isEmpty {
|
||||||
@ -91,19 +89,31 @@ import Foundation
|
|||||||
if let bodyLabel = body.text, !bodyLabel.isEmpty {
|
if let bodyLabel = body.text, !bodyLabel.isEmpty {
|
||||||
message += bodyLabel
|
message += bodyLabel
|
||||||
}
|
}
|
||||||
|
return message.count > 0 ? message : nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensures voice over does not read "selected" after user triggers action on cell.
|
||||||
|
override public var accessibilityTraits: UIAccessibilityTraits {
|
||||||
|
get {
|
||||||
|
return (accessoryView != nil) ? .button : .none
|
||||||
|
}
|
||||||
|
set {}
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateAccessibilityLabel() {
|
||||||
|
|
||||||
let linkShowing = link.titleLabel?.text?.count ?? 0 > 0
|
let linkShowing = link.titleLabel?.text?.count ?? 0 > 0
|
||||||
isAccessibilityElement = !linkShowing
|
isAccessibilityElement = !linkShowing
|
||||||
link.isAccessibilityElement = linkShowing
|
|
||||||
|
|
||||||
if !linkShowing {
|
if !linkShowing {
|
||||||
// Make whole cell focusable if no link.
|
// Make whole cell focusable if no link.
|
||||||
accessibilityLabel = message
|
accessibilityLabel = getAccessibilityMessage()
|
||||||
|
} else if let accessoryView = accessoryView {
|
||||||
|
// Both caret and link. Read all content on caret.
|
||||||
|
accessoryView.accessibilityLabel = getAccessibilityMessage()
|
||||||
|
accessibilityElements = [accessoryView, link]
|
||||||
} else {
|
} else {
|
||||||
// Allow only radio button and link to be focused on.
|
// Only link. Manually add accessibility elements to ensure they are read in the right order.
|
||||||
var elements: [UIView] = []
|
var elements: [Any] = []
|
||||||
|
|
||||||
|
|
||||||
if let eyeBrowText = eyebrow.text, !eyeBrowText.isEmpty {
|
if let eyeBrowText = eyebrow.text, !eyeBrowText.isEmpty {
|
||||||
elements.append(eyebrow)
|
elements.append(eyebrow)
|
||||||
}
|
}
|
||||||
@ -119,11 +129,7 @@ import Foundation
|
|||||||
if let bodyText = body.text, !bodyText.isEmpty {
|
if let bodyText = body.text, !bodyText.isEmpty {
|
||||||
elements.append(body)
|
elements.append(body)
|
||||||
}
|
}
|
||||||
|
elements.append(link)
|
||||||
if linkShowing {
|
|
||||||
elements.append(link)
|
|
||||||
}
|
|
||||||
|
|
||||||
accessibilityElements = elements
|
accessibilityElements = elements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,8 +24,6 @@ import Foundation
|
|||||||
super.setupView()
|
super.setupView()
|
||||||
|
|
||||||
addMolecule(headlineBody)
|
addMolecule(headlineBody)
|
||||||
isAccessibilityElement = true
|
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?){
|
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?){
|
||||||
@ -46,7 +44,7 @@ import Foundation
|
|||||||
//-----------------------------------------------------
|
//-----------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let headlineLabel = headlineBody.headlineLabel.text {
|
if let headlineLabel = headlineBody.headlineLabel.text {
|
||||||
|
|||||||
@ -41,8 +41,6 @@ import Foundation
|
|||||||
rightLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 900), for: .horizontal)
|
rightLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 900), for: .horizontal)
|
||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
isAccessibilityElement = true
|
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@ -75,7 +73,7 @@ import Foundation
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let leftLabelText = leftLabel.text, !leftLabelText.isEmpty {
|
if let leftLabelText = leftLabel.text, !leftLabelText.isEmpty {
|
||||||
@ -91,5 +89,6 @@ import Foundation
|
|||||||
}
|
}
|
||||||
|
|
||||||
accessibilityLabel = message
|
accessibilityLabel = message
|
||||||
|
accessibilityTraits = (accessoryView != nil) ? .button : .none
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -47,9 +47,9 @@ import Foundation
|
|||||||
|
|
||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
updateAccessibilityLabel()
|
|
||||||
accessibilityValue = button.accessibilityValue
|
accessibilityValue = button.accessibilityValue
|
||||||
accessibilityHint = button.accessibilityHint
|
accessibilityHint = button.accessibilityHint
|
||||||
|
accessibilityTraits = .button
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------
|
//-----------------------------------------------------
|
||||||
@ -74,48 +74,36 @@ import Foundation
|
|||||||
// MARK: - Accessibility
|
// MARK: - Accessibility
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
|
|
||||||
|
func getAccessibilityMessage() -> String? {
|
||||||
|
guard let buttonText = button.titleLabel?.text else {
|
||||||
|
return eyebrowHeadlineBodyLink.getAccessibilityMessage()
|
||||||
|
}
|
||||||
|
guard let label = eyebrowHeadlineBodyLink.getAccessibilityMessage() else {
|
||||||
|
return buttonText
|
||||||
|
}
|
||||||
|
return label + ", " + buttonText
|
||||||
|
}
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
|
||||||
var message = ""
|
|
||||||
|
|
||||||
if let eyebrowLabel = eyebrowHeadlineBodyLink.eyebrow.text {
|
|
||||||
message += eyebrowLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let headlineLabel = eyebrowHeadlineBodyLink.headline.text {
|
|
||||||
message += headlineLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let bodyLabel = eyebrowHeadlineBodyLink.body.text {
|
|
||||||
message += bodyLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let buttonLabel = button.accessibilityLabel {
|
|
||||||
message += buttonLabel
|
|
||||||
}
|
|
||||||
|
|
||||||
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
||||||
|
if !linkShowing && accessoryView == nil {
|
||||||
isAccessibilityElement = !linkShowing
|
// Make whole cell focusable if one action
|
||||||
button.isAccessibilityElement = linkShowing
|
isAccessibilityElement = true
|
||||||
eyebrowHeadlineBodyLink.link.isAccessibilityElement = linkShowing
|
accessibilityLabel = getAccessibilityMessage()
|
||||||
|
|
||||||
if !linkShowing {
|
|
||||||
// Make whole cell focusable if no link.
|
|
||||||
accessibilityLabel = message
|
|
||||||
} else {
|
} else {
|
||||||
// Allow only radio button and link to be focused on.
|
// Make buttons focusable.
|
||||||
button.accessibilityLabel = message
|
isAccessibilityElement = false
|
||||||
var elements: [UIView] = []
|
var elements: [Any] = []
|
||||||
|
if let accessoryView = accessoryView {
|
||||||
if !message.isEmpty {
|
accessoryView.accessibilityLabel = eyebrowHeadlineBodyLink.getAccessibilityMessage()
|
||||||
elements.append(button)
|
elements.append(accessoryView)
|
||||||
|
} else {
|
||||||
|
button.accessibilityLabel = getAccessibilityMessage()
|
||||||
}
|
}
|
||||||
|
elements.append(button)
|
||||||
if linkShowing {
|
if linkShowing {
|
||||||
elements.append(eyebrowHeadlineBodyLink.link)
|
elements.append(eyebrowHeadlineBodyLink.link)
|
||||||
}
|
}
|
||||||
|
|
||||||
accessibilityElements = elements
|
accessibilityElements = elements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,8 +40,6 @@ import Foundation
|
|||||||
rightImage.addSizeConstraintsForAspectRatio = true
|
rightImage.addSizeConstraintsForAspectRatio = true
|
||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
isAccessibilityElement = true
|
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
@ -72,17 +70,18 @@ import Foundation
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let leftLabelText = leftLabel.text, !leftLabelText.isEmpty {
|
if let leftLabelText = leftLabel.text, !leftLabelText.isEmpty {
|
||||||
message += leftLabelText + ", "
|
message += leftLabelText + ", "
|
||||||
}
|
}
|
||||||
|
|
||||||
if let rightImageText = rightImage.accessibilityLabel, !rightImageText.isEmpty {
|
if let rightImageText = rightImage.imageView.accessibilityLabel, !rightImageText.isEmpty {
|
||||||
message += rightImageText
|
message += rightImageText
|
||||||
}
|
}
|
||||||
|
|
||||||
accessibilityLabel = message
|
accessibilityLabel = message
|
||||||
|
accessibilityTraits = (accessoryView != nil) ? .button : .none
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -67,7 +67,6 @@ import Foundation
|
|||||||
arrow.pinHeightAndWidth()
|
arrow.pinHeightAndWidth()
|
||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
|
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
|
||||||
@ -89,57 +88,36 @@ import Foundation
|
|||||||
// MARK: - Accessibility
|
// MARK: - Accessibility
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func getAccessibilityMessage() -> String? {
|
||||||
|
guard let rightLabelText = rightLabel.text else {
|
||||||
|
return eyebrowHeadlineBodyLink.getAccessibilityMessage()
|
||||||
|
}
|
||||||
|
guard let label = eyebrowHeadlineBodyLink.getAccessibilityMessage() else {
|
||||||
|
return rightLabelText
|
||||||
|
}
|
||||||
|
return label + ", " + rightLabelText
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateAccessibilityLabel() {
|
||||||
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
||||||
isAccessibilityElement = !linkShowing
|
isAccessibilityElement = !linkShowing
|
||||||
eyebrowHeadlineBodyLink.link.isAccessibilityElement = linkShowing
|
accessibilityTraits = (isAccessibilityElement && accessoryView != nil) ? .button : .none
|
||||||
|
|
||||||
if !linkShowing {
|
if !linkShowing {
|
||||||
// Make whole cell focusable if no link.
|
// Make whole cell focusable if no link.
|
||||||
var message = ""
|
accessibilityLabel = getAccessibilityMessage()
|
||||||
|
} else if let accessoryView = accessoryView {
|
||||||
if let eyebrowLabel = eyebrowHeadlineBodyLink.eyebrow.text {
|
// Both caret and link. Read all content on caret.
|
||||||
message += eyebrowLabel + ", "
|
accessoryView.accessibilityLabel = getAccessibilityMessage()
|
||||||
}
|
accessibilityElements = [accessoryView, eyebrowHeadlineBodyLink.link]
|
||||||
|
|
||||||
if let headlineLabel = eyebrowHeadlineBodyLink.headline.text {
|
|
||||||
message += headlineLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let bodyLabel = eyebrowHeadlineBodyLink.body.text {
|
|
||||||
message += bodyLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let rightLabelText = rightLabel.text {
|
|
||||||
message += rightLabelText
|
|
||||||
}
|
|
||||||
|
|
||||||
accessibilityLabel = message
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
var elements: [UIView] = []
|
// Only link. Manually add accessibility elements to ensure they are read in the right order.
|
||||||
|
var elements: [Any] = []
|
||||||
if let eyebrowText = eyebrowHeadlineBodyLink.eyebrow.text, !eyebrowText.isEmpty {
|
if let otherElements = eyebrowHeadlineBodyLink.getAccessibilityElements() {
|
||||||
elements.append(eyebrowHeadlineBodyLink.eyebrow)
|
elements.append(otherElements)
|
||||||
}
|
}
|
||||||
|
|
||||||
if let headlineText = eyebrowHeadlineBodyLink.headline.text, !headlineText.isEmpty {
|
|
||||||
elements.append(eyebrowHeadlineBodyLink.headline)
|
|
||||||
}
|
|
||||||
|
|
||||||
if let bodyText = eyebrowHeadlineBodyLink.body.text, !bodyText.isEmpty {
|
|
||||||
elements.append(eyebrowHeadlineBodyLink.body)
|
|
||||||
}
|
|
||||||
|
|
||||||
if linkShowing {
|
|
||||||
elements.append(eyebrowHeadlineBodyLink.link)
|
|
||||||
}
|
|
||||||
|
|
||||||
if let rightLabelText = rightLabel.text, !rightLabelText.isEmpty {
|
if let rightLabelText = rightLabel.text, !rightLabelText.isEmpty {
|
||||||
elements.append(rightLabel)
|
elements.append(rightLabel)
|
||||||
}
|
}
|
||||||
|
|
||||||
accessibilityElements = elements
|
accessibilityElements = elements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -54,8 +54,6 @@ import Foundation
|
|||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
arrowAndRightLabelStack.restack()
|
arrowAndRightLabelStack.restack()
|
||||||
isAccessibilityElement = true
|
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -87,7 +85,7 @@ import Foundation
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let headlineText = headlineBody.headlineLabel.text, !headlineText.isEmpty {
|
if let headlineText = headlineBody.headlineLabel.text, !headlineText.isEmpty {
|
||||||
@ -103,5 +101,6 @@ import Foundation
|
|||||||
}
|
}
|
||||||
|
|
||||||
accessibilityLabel = message
|
accessibilityLabel = message
|
||||||
|
accessibilityTraits = (accessoryView != nil) ? .button : .none
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -47,7 +47,6 @@ import Foundation
|
|||||||
|
|
||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -72,48 +71,37 @@ import Foundation
|
|||||||
// MARK: - Accessibility
|
// MARK: - Accessibility
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
func getAccessibilityMessage() -> String? {
|
||||||
|
guard let linkText = link.titleLabel?.text else {
|
||||||
|
return eyebrowHeadlineBodyLink.getAccessibilityMessage()
|
||||||
|
}
|
||||||
|
guard let label = eyebrowHeadlineBodyLink.getAccessibilityMessage() else {
|
||||||
|
return linkText
|
||||||
|
}
|
||||||
|
return label + ", " + linkText
|
||||||
|
}
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
|
||||||
var message = ""
|
|
||||||
|
|
||||||
if let eyebrowLabel = eyebrowHeadlineBodyLink.eyebrow.text {
|
|
||||||
message += eyebrowLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let headlineLabel = eyebrowHeadlineBodyLink.headline.text {
|
|
||||||
message += headlineLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let bodyLabel = eyebrowHeadlineBodyLink.body.text {
|
|
||||||
message += bodyLabel + ", "
|
|
||||||
}
|
|
||||||
|
|
||||||
if let linkLabel = link.accessibilityLabel {
|
|
||||||
message += linkLabel
|
|
||||||
}
|
|
||||||
|
|
||||||
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
let linkShowing = eyebrowHeadlineBodyLink.link.titleLabel?.text?.count ?? 0 > 0
|
||||||
|
accessibilityTraits = .button
|
||||||
isAccessibilityElement = !linkShowing
|
if !linkShowing && accessoryView == nil {
|
||||||
link.isAccessibilityElement = linkShowing
|
// Make whole cell focusable if one action
|
||||||
eyebrowHeadlineBodyLink.link.isAccessibilityElement = linkShowing
|
isAccessibilityElement = true
|
||||||
|
accessibilityLabel = getAccessibilityMessage()
|
||||||
if !linkShowing {
|
|
||||||
// Make whole cell focusable if no link.
|
|
||||||
accessibilityLabel = message
|
|
||||||
} else {
|
} else {
|
||||||
// Allow only radio button and link to be focused on.
|
// Make buttons focusable.
|
||||||
link.accessibilityLabel = message
|
isAccessibilityElement = false
|
||||||
var elements: [UIView] = []
|
var elements: [Any] = []
|
||||||
|
if let accessoryView = accessoryView {
|
||||||
|
accessoryView.accessibilityLabel = eyebrowHeadlineBodyLink.getAccessibilityMessage()
|
||||||
|
elements.append(accessoryView)
|
||||||
|
} else {
|
||||||
|
link.accessibilityLabel = getAccessibilityMessage()
|
||||||
|
}
|
||||||
|
elements.append(link)
|
||||||
if linkShowing {
|
if linkShowing {
|
||||||
elements.append(eyebrowHeadlineBodyLink.link)
|
elements.append(eyebrowHeadlineBodyLink.link)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !message.isEmpty {
|
|
||||||
elements.append(link)
|
|
||||||
}
|
|
||||||
|
|
||||||
accessibilityElements = elements
|
accessibilityElements = elements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -51,8 +51,6 @@ import Foundation
|
|||||||
rightLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 900), for: .horizontal)
|
rightLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 900), for: .horizontal)
|
||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
isAccessibilityElement = true
|
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -86,7 +84,7 @@ import Foundation
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let leftLabelText = leftLabel.text, !leftLabelText.isEmpty {
|
if let leftLabelText = leftLabel.text, !leftLabelText.isEmpty {
|
||||||
@ -98,5 +96,6 @@ import Foundation
|
|||||||
}
|
}
|
||||||
|
|
||||||
accessibilityLabel = message
|
accessibilityLabel = message
|
||||||
|
accessibilityTraits = (accessoryView != nil) ? .button : .none
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -42,8 +42,6 @@ import Foundation
|
|||||||
super.setupView()
|
super.setupView()
|
||||||
addMolecule(stack)
|
addMolecule(stack)
|
||||||
stack.restack()
|
stack.restack()
|
||||||
isAccessibilityElement = true
|
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -77,7 +75,7 @@ import Foundation
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let leftText = leftLabel.text, !leftText.isEmpty {
|
if let leftText = leftLabel.text, !leftText.isEmpty {
|
||||||
|
|||||||
@ -55,8 +55,6 @@ import Foundation
|
|||||||
arrow.pinHeightAndWidth()
|
arrow.pinHeightAndWidth()
|
||||||
arrowAndLabel2Stack.restack()
|
arrowAndLabel2Stack.restack()
|
||||||
stack.restack()
|
stack.restack()
|
||||||
isAccessibilityElement = true
|
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
|
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
|
||||||
@ -87,7 +85,7 @@ import Foundation
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let leftText = leftLabel.text, !leftText.isEmpty {
|
if let leftText = leftLabel.text, !leftText.isEmpty {
|
||||||
|
|||||||
@ -54,7 +54,6 @@ import Foundation
|
|||||||
((molecule as? StackItem)?.view as? Stack<StackModel>)?.restack()
|
((molecule as? StackItem)?.view as? Stack<StackModel>)?.restack()
|
||||||
}
|
}
|
||||||
containingStack.restack()
|
containingStack.restack()
|
||||||
isAccessibilityElement = false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------
|
//------------------------------------------------------
|
||||||
|
|||||||
@ -67,9 +67,6 @@ import Foundation
|
|||||||
leftHeadline.numberOfLines = 1
|
leftHeadline.numberOfLines = 1
|
||||||
rightLabel.numberOfLines = 1
|
rightLabel.numberOfLines = 1
|
||||||
rightSubLabel.numberOfLines = 1
|
rightSubLabel.numberOfLines = 1
|
||||||
|
|
||||||
isAccessibilityElement = true
|
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
@ -107,7 +104,7 @@ import Foundation
|
|||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let leftHeadline = leftHeadline.text, !leftHeadline.isEmpty {
|
if let leftHeadline = leftHeadline.text, !leftHeadline.isEmpty {
|
||||||
|
|||||||
@ -31,8 +31,6 @@ import UIKit
|
|||||||
containerHelper.constrainView(view)
|
containerHelper.constrainView(view)
|
||||||
rightLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 900), for: .horizontal)
|
rightLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 900), for: .horizontal)
|
||||||
rightLabel.setContentHuggingPriority(.defaultHigh, for: .vertical)
|
rightLabel.setContentHuggingPriority(.defaultHigh, for: .vertical)
|
||||||
isAccessibilityElement = true
|
|
||||||
updateAccessibilityLabel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func updateView(_ size: CGFloat) {
|
open override func updateView(_ size: CGFloat) {
|
||||||
@ -72,7 +70,7 @@ import UIKit
|
|||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
|
|
||||||
func updateAccessibilityLabel() {
|
func updateAccessibilityLabel() {
|
||||||
|
isAccessibilityElement = true
|
||||||
var message = ""
|
var message = ""
|
||||||
|
|
||||||
if let leftLabel = leftLabel.text, !leftLabel.isEmpty {
|
if let leftLabel = leftLabel.text, !leftLabel.isEmpty {
|
||||||
|
|||||||
@ -56,7 +56,7 @@ import Foundation
|
|||||||
// Add buttons
|
// Add buttons
|
||||||
var tabs: [UITabBarItem] = []
|
var tabs: [UITabBarItem] = []
|
||||||
for (index, tab) in model.tabs.enumerated() {
|
for (index, tab) in model.tabs.enumerated() {
|
||||||
let tabBarItem = UITabBarItem(title: tab.title, image: UIImage(named: tab.image, in: MVMCoreCache.shared()?.bundleToUseForImages(), compatibleWith: nil), tag: index)
|
let tabBarItem = UITabBarItem(title: tab.title, image: MVMCoreCache.shared()?.getImageFromRegisteredBundles(tab.image), tag: index)
|
||||||
tabs.append(tabBarItem)
|
tabs.append(tabBarItem)
|
||||||
}
|
}
|
||||||
setItems(tabs, animated: false)
|
setItems(tabs, animated: false)
|
||||||
|
|||||||
@ -11,34 +11,34 @@ public class NavigationImageButtonModel: NavigationButtonModelProtocol, Molecule
|
|||||||
public var backgroundColor: Color?
|
public var backgroundColor: Color?
|
||||||
public static var identifier: String = "navigationImageButton"
|
public static var identifier: String = "navigationImageButton"
|
||||||
|
|
||||||
public var imageName: String
|
public var image: String
|
||||||
public var action: ActionModelProtocol
|
public var action: ActionModelProtocol
|
||||||
|
|
||||||
public init(with imageName: String, action: ActionModelProtocol) {
|
public init(with image: String, action: ActionModelProtocol) {
|
||||||
self.imageName = imageName
|
self.image = image
|
||||||
self.action = action
|
self.action = action
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum CodingKeys: String, CodingKey {
|
private enum CodingKeys: String, CodingKey {
|
||||||
case imageName
|
case image
|
||||||
case action
|
case action
|
||||||
}
|
}
|
||||||
|
|
||||||
required public init(from decoder: Decoder) throws {
|
required public init(from decoder: Decoder) throws {
|
||||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
imageName = try typeContainer.decode(String.self, forKey: .imageName)
|
image = try typeContainer.decode(String.self, forKey: .image)
|
||||||
action = try typeContainer.decodeModel(codingKey: .action)
|
action = try typeContainer.decodeModel(codingKey: .action)
|
||||||
}
|
}
|
||||||
|
|
||||||
open func encode(to encoder: Encoder) throws {
|
open func encode(to encoder: Encoder) throws {
|
||||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||||
try container.encode(imageName, forKey: .imageName)
|
try container.encode(image, forKey: .image)
|
||||||
try container.encodeModel(action, forKey: .action)
|
try container.encodeModel(action, forKey: .action)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Convenience function that creates a BarButtonItem for the model.
|
/// Convenience function that creates a BarButtonItem for the model.
|
||||||
public func createNavigationItemButton(delegateObject: MVMCoreUIDelegateObject? = nil, additionalData: [AnyHashable: Any]? = nil) -> UIBarButtonItem {
|
public func createNavigationItemButton(delegateObject: MVMCoreUIDelegateObject? = nil, additionalData: [AnyHashable: Any]? = nil) -> UIBarButtonItem {
|
||||||
let image = UIImage(named: imageName, in: MVMCoreCache.shared()?.bundleToUseForImages(), compatibleWith: nil)
|
let uiImage = MVMCoreCache.shared()?.getImageFromRegisteredBundles(image)
|
||||||
return ImageBarButtonItem.create(with: image, actionModel: action, delegateObject: delegateObject, additionalData: additionalData)
|
return ImageBarButtonItem.create(with: uiImage, actionModel: action, delegateObject: delegateObject, additionalData: additionalData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,7 +19,7 @@ public class NavigationItemModel: NavigationItemModelProtocol, MoleculeModelProt
|
|||||||
public var tintColor: Color
|
public var tintColor: Color
|
||||||
public var line: LineModel?
|
public var line: LineModel?
|
||||||
public var alwaysShowBackButton = false
|
public var alwaysShowBackButton = false
|
||||||
public var backButton: (NavigationButtonModelProtocol & MoleculeModelProtocol)? = NavigationImageButtonModel(with: "back", action: ActionBackModel())
|
public var backButton: (NavigationButtonModelProtocol & MoleculeModelProtocol)? = NavigationImageButtonModel(with: "nav_back", action: ActionBackModel())
|
||||||
public var additionalLeftButtons: [(NavigationButtonModelProtocol & MoleculeModelProtocol)]?
|
public var additionalLeftButtons: [(NavigationButtonModelProtocol & MoleculeModelProtocol)]?
|
||||||
public var additionalRightButtons: [(NavigationButtonModelProtocol & MoleculeModelProtocol)]?
|
public var additionalRightButtons: [(NavigationButtonModelProtocol & MoleculeModelProtocol)]?
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ public class NavigationItemModel: NavigationItemModelProtocol, MoleculeModelProt
|
|||||||
hidden = try typeContainer.decodeIfPresent(Bool.self, forKey: .hidden) ?? false
|
hidden = try typeContainer.decodeIfPresent(Bool.self, forKey: .hidden) ?? false
|
||||||
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) ?? Color(uiColor: .white)
|
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) ?? Color(uiColor: .white)
|
||||||
tintColor = try typeContainer.decodeIfPresent(Color.self, forKey: .tintColor) ?? Color(uiColor: .black)
|
tintColor = try typeContainer.decodeIfPresent(Color.self, forKey: .tintColor) ?? Color(uiColor: .black)
|
||||||
line = try typeContainer.decodeIfPresent(LineModel.self, forKey: .line)
|
line = try typeContainer.decodeIfPresent(LineModel.self, forKey: .line) ?? LineModel(type: .standard)
|
||||||
alwaysShowBackButton = try typeContainer.decodeIfPresent(Bool.self, forKey: .alwaysShowBackButton) ?? false
|
alwaysShowBackButton = try typeContainer.decodeIfPresent(Bool.self, forKey: .alwaysShowBackButton) ?? false
|
||||||
if let backButton: (NavigationButtonModelProtocol & MoleculeModelProtocol) = try typeContainer.decodeModelIfPresent(codingKey: .backButton) {
|
if let backButton: (NavigationButtonModelProtocol & MoleculeModelProtocol) = try typeContainer.decodeModelIfPresent(codingKey: .backButton) {
|
||||||
self.backButton = backButton
|
self.backButton = backButton
|
||||||
|
|||||||
@ -69,4 +69,44 @@ import UIKit
|
|||||||
open override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? {
|
open override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? {
|
||||||
return 65
|
return 65
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Accessibility Helpers
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
/// Returns the labels text in one message.
|
||||||
|
func getAccessibilityMessage() -> String? {
|
||||||
|
var message = ""
|
||||||
|
|
||||||
|
if let eyebrowLabel = eyebrow.text {
|
||||||
|
message += eyebrowLabel + ", "
|
||||||
|
}
|
||||||
|
|
||||||
|
if let headlineLabel = headline.text {
|
||||||
|
message += headlineLabel + ", "
|
||||||
|
}
|
||||||
|
|
||||||
|
if let bodyLabel = body.text {
|
||||||
|
message += bodyLabel
|
||||||
|
}
|
||||||
|
return message.count > 0 ? message : nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns an array of the appropriate accessibility elements.
|
||||||
|
func getAccessibilityElements() -> [Any]? {
|
||||||
|
var elements: [UIView] = []
|
||||||
|
if eyebrow.hasText {
|
||||||
|
elements.append(eyebrow)
|
||||||
|
}
|
||||||
|
if headline.hasText {
|
||||||
|
elements.append(headline)
|
||||||
|
}
|
||||||
|
if body.hasText {
|
||||||
|
elements.append(body)
|
||||||
|
}
|
||||||
|
if link.titleLabel?.text?.count ?? 0 > 0 {
|
||||||
|
elements.append(link)
|
||||||
|
}
|
||||||
|
return elements.count > 0 ? elements : nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -73,8 +73,8 @@ open class ThreeHeadlineBodyLink: View {
|
|||||||
bottomAnchor.constraint(equalTo: link.bottomAnchor).isActive = true
|
bottomAnchor.constraint(equalTo: link.bottomAnchor).isActive = true
|
||||||
|
|
||||||
isAccessibilityElement = true
|
isAccessibilityElement = true
|
||||||
accessibilityTraits = link.accessibilityTraits
|
|
||||||
accessibilityHint = link.accessibilityHint
|
accessibilityHint = link.accessibilityHint
|
||||||
|
accessibilityTraits = link.accessibilityTraits
|
||||||
updateAccessibilityLabel()
|
updateAccessibilityLabel()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -205,8 +205,8 @@ import UIKit
|
|||||||
let caret = CaretView(lineWidth: 1)
|
let caret = CaretView(lineWidth: 1)
|
||||||
caret.translatesAutoresizingMaskIntoConstraints = true
|
caret.translatesAutoresizingMaskIntoConstraints = true
|
||||||
caret.isAccessibilityElement = true
|
caret.isAccessibilityElement = true
|
||||||
caret.accessibilityTraits = .button
|
|
||||||
caret.accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "AccTabHint")
|
caret.accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "AccTabHint")
|
||||||
|
caret.accessibilityTraits = .button
|
||||||
caret.size = .small(.vertical)
|
caret.size = .small(.vertical)
|
||||||
if let size = caret.size?.dimensions() {
|
if let size = caret.size?.dimensions() {
|
||||||
caret.frame = CGRect(origin: CGPoint.zero, size: size)
|
caret.frame = CGRect(origin: CGPoint.zero, size: size)
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
@objc open class ViewController: UIViewController, MVMCoreViewControllerProtocol, MVMCoreViewManagerViewControllerProtocol, MoleculeDelegateProtocol, FormHolderProtocol, MVMCoreActionDelegateProtocol, MVMCoreLoadDelegateProtocol, UITextFieldDelegate, UITextViewDelegate, ObservingTextFieldDelegate {
|
@objc open class ViewController: UIViewController, MVMCoreViewControllerProtocol, MVMCoreViewManagerViewControllerProtocol, MoleculeDelegateProtocol, FormHolderProtocol, MVMCoreActionDelegateProtocol, MVMCoreLoadDelegateProtocol, UITextFieldDelegate, UITextViewDelegate, ObservingTextFieldDelegate, MVMCoreUIDetailViewProtocol {
|
||||||
@objc public var pageType: String?
|
@objc public var pageType: String?
|
||||||
@objc public var loadObject: MVMCoreLoadObject?
|
@objc public var loadObject: MVMCoreLoadObject?
|
||||||
public var pageModel: MVMControllerModelProtocol?
|
public var pageModel: MVMControllerModelProtocol?
|
||||||
@ -163,9 +163,6 @@ import UIKit
|
|||||||
open func createDefaultLegacyNavigationModel() -> NavigationItemModel {
|
open func createDefaultLegacyNavigationModel() -> NavigationItemModel {
|
||||||
let navigationModel = NavigationItemModel()
|
let navigationModel = NavigationItemModel()
|
||||||
navigationModel.title = pageModel?.screenHeading
|
navigationModel.title = pageModel?.screenHeading
|
||||||
if /*(self as? MVMCoreUITabBarPageControlViewController) != nil ||*/ manager != nil || loadObject?.requestParameters?.tabWasPressed ?? false == true {
|
|
||||||
navigationModel.line = LineModel(type: .none)
|
|
||||||
}
|
|
||||||
return navigationModel
|
return navigationModel
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,18 +196,8 @@ import UIKit
|
|||||||
// We additionally want our left items
|
// We additionally want our left items
|
||||||
navigationItem.leftItemsSupplementBackButton = true
|
navigationItem.leftItemsSupplementBackButton = true
|
||||||
|
|
||||||
NavigationController.set(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
|
// Utilize helper function to set the split view and navigation item state.
|
||||||
|
MVMCoreUISplitViewController.setSplitViewController(for: viewController, navigationController: navigationController, navigationItemModel: navigationItemModel, leftPanelAccessible: isMasterInitiallyAccessible(), rightPanelAccessible: isSupportInitiallyAccessible(), progress: bottomProgress())
|
||||||
// Special logic when using the split view controller. Legacy Update Panels. Change how this is done.
|
|
||||||
guard navigationController == MVMCoreUISplitViewController.main()?.navigationController,
|
|
||||||
navigationController.topViewController == viewController else { return }
|
|
||||||
|
|
||||||
MVMCoreUISession.sharedGlobal()?.splitViewController?.setupPanels()
|
|
||||||
showBottomProgressBar()
|
|
||||||
|
|
||||||
MVMCoreUISplitViewController.main()?.setLeftPanelIsAccessible(isMasterInitiallyAccessible(), for: viewController)
|
|
||||||
MVMCoreUISplitViewController.main()?.setRightPanelIsAccessible(isSupportInitiallyAccessible(), for: viewController)
|
|
||||||
MVMCoreUISession.sharedGlobal()?.splitViewController?.setNavigationIconColor(navigationItemModel.tintColor.uiColor)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Eventually will be moved to server
|
// Eventually will be moved to server
|
||||||
@ -252,12 +239,10 @@ import UIKit
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Eventually will be moved to Model
|
// Eventually will be moved to Model
|
||||||
open func showBottomProgressBar() {
|
open func bottomProgress() -> Float? {
|
||||||
if MVMCoreUISplitViewController.main()?.getCurrentVisibleController() == self,
|
guard let progressString = loadObject?.pageJSON?.optionalStringForKey(KeyProgressPercent),
|
||||||
let progressString = loadObject?.pageJSON?.optionalStringForKey(KeyProgressPercent),
|
let progress = Float(progressString) else { return nil }
|
||||||
let progress = Float(progressString) {
|
return (progress / Float(100))
|
||||||
MVMCoreUISplitViewController.main()?.setBottomProgressBarProgress(progress / Float(100))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - TabBar
|
// MARK: - TabBar
|
||||||
@ -321,24 +306,23 @@ import UIKit
|
|||||||
super.viewDidLayoutSubviews()
|
super.viewDidLayoutSubviews()
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func viewWillAppear(_ animated: Bool) {
|
open func pageShown() {
|
||||||
super.viewWillAppear(animated)
|
// Update the navigation bar ui when view is appearing.
|
||||||
|
setNavigationController()
|
||||||
|
|
||||||
// Update the navigation bar ui when view is appearing. Can remove check in the future, see viewControllerReady
|
// Update tab if needed.
|
||||||
if manager == nil {
|
updateTabBar()
|
||||||
setNavigationController()
|
|
||||||
}
|
// Track.
|
||||||
|
MVMCoreUISession.sharedGlobal()?.currentPageType = pageType
|
||||||
|
MVMCoreUILoggingHandler.shared()?.defaultLogPageState(forController: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func viewDidAppear(_ animated: Bool) {
|
open override func viewDidAppear(_ animated: Bool) {
|
||||||
super.viewDidAppear(animated)
|
super.viewDidAppear(animated)
|
||||||
|
|
||||||
// Update tab if needed.
|
|
||||||
updateTabBar()
|
|
||||||
|
|
||||||
if manager == nil {
|
if manager == nil {
|
||||||
MVMCoreUISession.sharedGlobal()?.currentPageType = pageType
|
pageShown()
|
||||||
MVMCoreUILoggingHandler.shared()?.defaultLogPageState(forController: self)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
executeBehaviors { (behavior: PageVisibilityBehavior) in
|
executeBehaviors { (behavior: PageVisibilityBehavior) in
|
||||||
@ -375,13 +359,7 @@ import UIKit
|
|||||||
|
|
||||||
// MARK: - MVMCoreViewManagerViewControllerProtocol
|
// MARK: - MVMCoreViewManagerViewControllerProtocol
|
||||||
open func viewControllerReady(inManager manager: UIViewController & MVMCoreViewManagerProtocol) {
|
open func viewControllerReady(inManager manager: UIViewController & MVMCoreViewManagerProtocol) {
|
||||||
// TODO: This check and set aren't technically needed anymore. The one in viewwillappear should be enough. However, there is a timing issue with the manager where the screen lays out before the menu shows, so the screen grows off the screen. Can fix in the future.
|
pageShown()
|
||||||
if let _ = self.view {
|
|
||||||
setNavigationController()
|
|
||||||
}
|
|
||||||
// Janky way to track current page.
|
|
||||||
MVMCoreUISession.sharedGlobal()?.currentPageType = pageType
|
|
||||||
MVMCoreUILoggingHandler.shared()?.defaultLogPageState(forController: self)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - MVMCoreLoadDelegateProtocol
|
// MARK: - MVMCoreLoadDelegateProtocol
|
||||||
@ -443,6 +421,13 @@ import UIKit
|
|||||||
open func addMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], indexPath: IndexPath, animation: UITableView.RowAnimation) {}
|
open func addMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], indexPath: IndexPath, animation: UITableView.RowAnimation) {}
|
||||||
open func removeMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], animation: UITableView.RowAnimation) {}
|
open func removeMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], animation: UITableView.RowAnimation) {}
|
||||||
|
|
||||||
|
// MARK: - MVMCoreUIDetailViewProtocol
|
||||||
|
|
||||||
|
// Reset the navigation state.
|
||||||
|
public func splitViewDidReset() {
|
||||||
|
setNavigationController()
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - UITextFieldDelegate (Check if this is still needed)
|
// MARK: - UITextFieldDelegate (Check if this is still needed)
|
||||||
// To Remove TextFields Bug: Keyboard is not dismissing after reaching textfield max length limit
|
// To Remove TextFields Bug: Keyboard is not dismissing after reaching textfield max length limit
|
||||||
open func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
open func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
||||||
|
|||||||
@ -67,8 +67,8 @@ import UIKit
|
|||||||
viewController.navigationItem.rightBarButtonItems = rightItems.count > 0 ? rightItems : nil
|
viewController.navigationItem.rightBarButtonItems = rightItems.count > 0 ? rightItems : nil
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Convenience function for setting navigation bar with model.
|
/// Convenience function for setting the navigation bar ui, except for the buttons.
|
||||||
public static func set(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, viewController: UIViewController) {
|
public static func setNavigationUI(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, viewController: UIViewController) {
|
||||||
viewController.navigationItem.title = navigationItemModel.title
|
viewController.navigationItem.title = navigationItemModel.title
|
||||||
viewController.navigationItem.accessibilityLabel = navigationItemModel.title
|
viewController.navigationItem.accessibilityLabel = navigationItemModel.title
|
||||||
viewController.navigationItem.hidesBackButton = (navigationItemModel.backButton != nil)
|
viewController.navigationItem.hidesBackButton = (navigationItemModel.backButton != nil)
|
||||||
@ -86,8 +86,11 @@ import UIKit
|
|||||||
if let navigationController = navigationController as? NavigationController {
|
if let navigationController = navigationController as? NavigationController {
|
||||||
navigationController.separatorView?.isHidden = navigationItemModel.line?.type ?? .standard == .none
|
navigationController.separatorView?.isHidden = navigationItemModel.line?.type ?? .standard == .none
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Sets up the navigation buttons.
|
/// Convenience function for setting navigation bar with model.
|
||||||
|
public static func set(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, viewController: UIViewController) {
|
||||||
|
setNavigationUI(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
|
||||||
setNavigationButtons(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
|
setNavigationButtons(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -42,6 +42,9 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
- (UIStatusBarStyle)defaultStatusBarStyle;
|
- (UIStatusBarStyle)defaultStatusBarStyle;
|
||||||
- (nullable UIColor *)defaultStatusBarBackgroundColor;
|
- (nullable UIColor *)defaultStatusBarBackgroundColor;
|
||||||
|
|
||||||
|
/// Called when the split view did reset. If this function found, the splitview assumes it is handling the split view state and does not do anything. If you have navigation item buttons, override this function and handle the panels manually.
|
||||||
|
- (void)splitViewDidReset;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
NS_ASSUME_NONNULL_END
|
||||||
|
|||||||
@ -0,0 +1,122 @@
|
|||||||
|
//
|
||||||
|
// MVMCoreUISplitViewController+Extension.swift
|
||||||
|
// MVMCoreUI
|
||||||
|
//
|
||||||
|
// Created by Scott Pfeil on 6/18/20.
|
||||||
|
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
public extension MVMCoreUISplitViewController {
|
||||||
|
|
||||||
|
/// Convenience function. Sets the navigation and split view properties for the view controller.
|
||||||
|
static func setSplitViewController(for viewController: UIViewController, navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, leftPanelAccessible: Bool, rightPanelAccessible: Bool, progress: Float? = nil) {
|
||||||
|
guard let splitView = MVMCoreUISplitViewController.main(),
|
||||||
|
navigationController == splitView.navigationController,
|
||||||
|
navigationController.topViewController == viewController else {
|
||||||
|
NavigationController.set(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
splitView.set(for: viewController, navigationController: navigationController, navigationItemModel: navigationItemModel, leftPanelAccessible: leftPanelAccessible, rightPanelAccessible: rightPanelAccessible, progress: progress)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the navigation item for the view controller based on the model and splitview controller
|
||||||
|
func set(for viewController: UIViewController, navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, leftPanelAccessible: Bool, rightPanelAccessible: Bool, progress: Float? = nil) {
|
||||||
|
|
||||||
|
// Setup the panels.
|
||||||
|
MVMCoreUISession.sharedGlobal()?.splitViewController?.setupPanels()
|
||||||
|
|
||||||
|
NavigationController.setNavigationUI(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
|
||||||
|
|
||||||
|
MVMCoreUISplitViewController.main()?.setLeftPanelIsAccessible(leftPanelAccessible, for: viewController, updateNavigationButtons: false)
|
||||||
|
MVMCoreUISplitViewController.main()?.setRightPanelIsAccessible(rightPanelAccessible, for: viewController, updateNavigationButtons: false)
|
||||||
|
|
||||||
|
setLeftNavigationButtons(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
|
||||||
|
setRightNavigationButtons(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
|
||||||
|
|
||||||
|
MVMCoreUISession.sharedGlobal()?.splitViewController?.setNavigationIconColor(navigationItemModel.tintColor.uiColor)
|
||||||
|
|
||||||
|
setBottomProgressBarProgress(progress ?? 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the left navigation items for the view controller based on model and splitview.
|
||||||
|
func setLeftNavigationButtons(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol?, viewController: UIViewController) {
|
||||||
|
var leftItems: [UIBarButtonItem] = []
|
||||||
|
let delegate = (viewController as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject
|
||||||
|
|
||||||
|
// Add back button first.
|
||||||
|
if let backButtonModel = navigationItemModel?.backButton {
|
||||||
|
if navigationController.viewControllers.count > 1 || navigationItemModel!.alwaysShowBackButton {
|
||||||
|
leftItems.append(backButtonModel.createNavigationItemButton(delegateObject: delegate, additionalData: nil))
|
||||||
|
}
|
||||||
|
} else if let backButton = backButton,
|
||||||
|
navigationController.viewControllers.count > 1 {
|
||||||
|
leftItems.append(backButton)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the panel button after the back button.
|
||||||
|
if let panelButton = leftPanelButton,
|
||||||
|
leftPanelIsAccessible,
|
||||||
|
!leftPanelStaysExtended() {
|
||||||
|
leftItems.append(panelButton)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add other model buttons
|
||||||
|
if let leftItemModels = navigationItemModel?.additionalLeftButtons {
|
||||||
|
for item in leftItemModels {
|
||||||
|
leftItems.append(item.createNavigationItemButton(delegateObject: delegate, additionalData: nil))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add any buttons added by the splitview.
|
||||||
|
if let additionalLeftButtons = additionalLeftButtons(for: viewController) {
|
||||||
|
leftItems.append(contentsOf: additionalLeftButtons)
|
||||||
|
}
|
||||||
|
|
||||||
|
viewController.navigationItem.setLeftBarButtonItems(leftItems.count > 0 ? leftItems : nil, animated: !DisableAnimations.boolValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the right navigation items for the view controller based on model and splitview.
|
||||||
|
func setRightNavigationButtons(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol?, viewController: UIViewController) {
|
||||||
|
let delegate = (viewController as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject
|
||||||
|
var rightItems: [UIBarButtonItem] = []
|
||||||
|
|
||||||
|
// Add the panel button first.
|
||||||
|
if let panelButton = rightPanelButton,
|
||||||
|
rightPanelIsAccessible,
|
||||||
|
!rightPanelStaysExtended() {
|
||||||
|
rightItems.append(panelButton)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add other model buttons
|
||||||
|
if let rightItemModels = navigationItemModel?.additionalRightButtons {
|
||||||
|
for item in rightItemModels {
|
||||||
|
rightItems.append(item.createNavigationItemButton(delegateObject: delegate, additionalData: nil))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add any buttons added by the splitview.
|
||||||
|
if let additionalRightButtons = additionalRightButtons(for: viewController) {
|
||||||
|
rightItems.append(contentsOf: additionalRightButtons)
|
||||||
|
}
|
||||||
|
|
||||||
|
viewController.navigationItem.setRightBarButtonItems(rightItems.count > 0 ? rightItems : nil, animated: !DisableAnimations.boolValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Legacy Functions
|
||||||
|
/// Convenience setter for legacy files. Sets the navigation item for the view controller based on the json and splitview controller
|
||||||
|
@objc static func setSplitViewController(for viewController: UIViewController, navigationController: UINavigationController, navigationJSON: [String: Any], leftPanelAccessible: Bool, rightPanelAccessible: Bool, progress: NSNumber?) throws {
|
||||||
|
guard let navigationItemModel = try MoleculeObjectMapping.shared()?.getMoleculeModelForJSON(navigationJSON) as? (MoleculeModelProtocol & NavigationItemModelProtocol) else {
|
||||||
|
throw ModelRegistry.Error.decoderOther(message: "Model not a bar model")
|
||||||
|
}
|
||||||
|
guard let splitView = MVMCoreUISplitViewController.main(),
|
||||||
|
navigationController == splitView.navigationController,
|
||||||
|
navigationController.topViewController == viewController else {
|
||||||
|
NavigationController.set(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let progress = progress?.floatValue
|
||||||
|
splitView.set(for: viewController, navigationController: navigationController, navigationItemModel: navigationItemModel, leftPanelAccessible: leftPanelAccessible, rightPanelAccessible: rightPanelAccessible, progress: progress)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -67,10 +67,10 @@ typedef NS_ENUM(NSInteger, MFNumberOfDrawers) {
|
|||||||
#pragma mark - Panel Functions
|
#pragma mark - Panel Functions
|
||||||
|
|
||||||
// Sets if the left panel accessible for the view controller. Will show or hide the button.
|
// Sets if the left panel accessible for the view controller. Will show or hide the button.
|
||||||
- (void)setLeftPanelIsAccessible:(BOOL)leftPanelIsAccessible forViewController:(nonnull UIViewController *)viewController;
|
- (void)setLeftPanelIsAccessible:(BOOL)leftPanelIsAccessible forViewController:(nonnull UIViewController *)viewController updateNavigationButtons:(BOOL)updateNavigationButtons;
|
||||||
|
|
||||||
// Sets if the right panel accessible for the view controller. Will show or hide the button.
|
// Sets if the right panel accessible for the view controller. Will show or hide the button.
|
||||||
- (void)setRightPanelIsAccessible:(BOOL)rightPanelIsAccessible forViewController:(nonnull UIViewController *)viewController;
|
- (void)setRightPanelIsAccessible:(BOOL)rightPanelIsAccessible forViewController:(nonnull UIViewController *)viewController updateNavigationButtons:(BOOL)updateNavigationButtons;
|
||||||
|
|
||||||
- (void)hideLeftPanelIfNeededAnimated:(BOOL)animated;
|
- (void)hideLeftPanelIfNeededAnimated:(BOOL)animated;
|
||||||
- (void)showLeftPanelAnimated:(BOOL)animated;
|
- (void)showLeftPanelAnimated:(BOOL)animated;
|
||||||
@ -94,6 +94,12 @@ typedef NS_ENUM(NSInteger, MFNumberOfDrawers) {
|
|||||||
/// Updates the panels that are used.
|
/// Updates the panels that are used.
|
||||||
- (void)setupPanels;
|
- (void)setupPanels;
|
||||||
|
|
||||||
|
/// Returns if the left panel is staying extended (usually do to screen size threshold)
|
||||||
|
- (BOOL)leftPanelStaysExtended;
|
||||||
|
|
||||||
|
/// Returns if the right panel is staying extended (usually do to screen size threshold)
|
||||||
|
- (BOOL)rightPanelStaysExtended;
|
||||||
|
|
||||||
#pragma mark - Bottom Progress Bar
|
#pragma mark - Bottom Progress Bar
|
||||||
|
|
||||||
- (void)setBottomProgressBarProgress:(float)progress;
|
- (void)setBottomProgressBarProgress:(float)progress;
|
||||||
|
|||||||
@ -110,11 +110,11 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (nullable NSArray <UIBarButtonItem *>*)additionalLeftButtonsForViewController:(nonnull UIViewController *)viewController {
|
- (nullable NSArray <UIBarButtonItem *>*)additionalLeftButtonsForViewController:(nonnull UIViewController *)viewController {
|
||||||
return viewController.navigationItem.leftBarButtonItems;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (nullable NSArray <UIBarButtonItem *>*)additionalRightButtonsForViewController:(nonnull UIViewController *)viewController {
|
- (nullable NSArray <UIBarButtonItem *>*)additionalRightButtonsForViewController:(nonnull UIViewController *)viewController {
|
||||||
return viewController.navigationItem.rightBarButtonItems;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (CGFloat)leftPanelExtendedWidth {
|
- (CGFloat)leftPanelExtendedWidth {
|
||||||
@ -146,7 +146,7 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (nullable UIImage *)imageForBackButton {
|
- (nullable UIImage *)imageForBackButton {
|
||||||
return [MVMCoreUIUtility imageNamed:@"back"];
|
return [MVMCoreUIUtility imageNamed:@"nav_back"];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Button Presses
|
#pragma mark - Button Presses
|
||||||
@ -234,19 +234,27 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)leftPanelStaysExtended {
|
||||||
|
MFNumberOfDrawers numberOfDrawers = [self numberOfDrawersShouldShow:self.transitionWidth];
|
||||||
|
return [self shouldExtendLeftPanel:numberOfDrawers] && (numberOfDrawers != MFOneDrawer || self.explictlyShowingPanel != self.rightPanel);
|
||||||
|
}
|
||||||
|
|
||||||
- (void)setLeftNavigationItemForViewController:(UIViewController * _Nonnull)viewController accessible:(BOOL)accessible extended:(BOOL)extended {
|
- (void)setLeftNavigationItemForViewController:(UIViewController * _Nonnull)viewController accessible:(BOOL)accessible extended:(BOOL)extended {
|
||||||
NSMutableArray *leftBarButtonItems = [NSMutableArray array];
|
NSMutableArray *leftBarButtonItems = [NSMutableArray array];
|
||||||
|
if ([viewController.navigationController.viewControllers count] > 1) {
|
||||||
|
[leftBarButtonItems addObject:self.backButton];
|
||||||
|
}
|
||||||
|
if ((accessible && !extended) && self.leftPanelButton) {
|
||||||
|
[leftBarButtonItems addObject:self.leftPanelButton];
|
||||||
|
}
|
||||||
NSArray *extraButtons = [self additionalLeftButtonsForViewController:viewController];
|
NSArray *extraButtons = [self additionalLeftButtonsForViewController:viewController];
|
||||||
if (extraButtons) {
|
if (extraButtons) {
|
||||||
[leftBarButtonItems addObjectsFromArray:extraButtons];
|
[leftBarButtonItems addObjectsFromArray:extraButtons];
|
||||||
}
|
}
|
||||||
if ((accessible && !extended) && self.leftPanelButton && ![extraButtons containsObject:self.leftPanelButton]) {
|
|
||||||
[leftBarButtonItems addObject:self.leftPanelButton];
|
|
||||||
}
|
|
||||||
[viewController.navigationItem setLeftBarButtonItems:(leftBarButtonItems.count > 0 ? leftBarButtonItems : nil) animated:!DisableAnimations];
|
[viewController.navigationItem setLeftBarButtonItems:(leftBarButtonItems.count > 0 ? leftBarButtonItems : nil) animated:!DisableAnimations];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setLeftPanelIsAccessible:(BOOL)leftPanelIsAccessible forViewController:(UIViewController *)viewController {
|
- (void)setLeftPanelIsAccessible:(BOOL)leftPanelIsAccessible forViewController:(UIViewController *)viewController updateNavigationButtons:(BOOL)updateNavigationButtons {
|
||||||
if ([self.leftPanel respondsToSelector:@selector(panelAvailable)]) {
|
if ([self.leftPanel respondsToSelector:@selector(panelAvailable)]) {
|
||||||
self.leftPanelIsAccessible = leftPanelIsAccessible && [self.leftPanel panelAvailable];
|
self.leftPanelIsAccessible = leftPanelIsAccessible && [self.leftPanel panelAvailable];
|
||||||
} else {
|
} else {
|
||||||
@ -262,8 +270,7 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Determine if we should show the panel (extended based on width or from explicit action).
|
// Determine if we should show the panel (extended based on width or from explicit action).
|
||||||
MFNumberOfDrawers numberOfDrawers = [self numberOfDrawersShouldShow:self.transitionWidth];
|
extended = [self leftPanelStaysExtended];
|
||||||
extended = [self shouldExtendLeftPanel:numberOfDrawers] && (numberOfDrawers != MFOneDrawer || self.explictlyShowingPanel != self.rightPanel);
|
|
||||||
if (extended || self.explictlyShowingPanel == self.leftPanel) {
|
if (extended || self.explictlyShowingPanel == self.leftPanel) {
|
||||||
[self showLeftPanelAnimated:NO explict:NO];
|
[self showLeftPanelAnimated:NO explict:NO];
|
||||||
}
|
}
|
||||||
@ -272,7 +279,9 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
[self.leftPanel resetIconToDefault];
|
[self.leftPanel resetIconToDefault];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[self setLeftNavigationItemForViewController:viewController accessible:self.leftPanelIsAccessible extended:extended];
|
if (updateNavigationButtons) {
|
||||||
|
[self setLeftNavigationItemForViewController:viewController accessible:self.leftPanelIsAccessible extended:extended];
|
||||||
|
}
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -407,10 +416,10 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
|
|
||||||
- (void)setRightNavigationItemForViewController:(UIViewController * _Nonnull)viewController accessible:(BOOL)accessible extended:(BOOL)extended {
|
- (void)setRightNavigationItemForViewController:(UIViewController * _Nonnull)viewController accessible:(BOOL)accessible extended:(BOOL)extended {
|
||||||
NSMutableArray *navigationItems = [[NSMutableArray alloc] init];
|
NSMutableArray *navigationItems = [[NSMutableArray alloc] init];
|
||||||
NSArray *extraButtons = [self additionalRightButtonsForViewController:viewController];
|
if ((accessible && !extended) && self.rightPanelButton) {
|
||||||
if ((accessible && !extended) && self.rightPanelButton && ![extraButtons containsObject:self.rightPanelButton]) {
|
|
||||||
[navigationItems addObject:self.rightPanelButton];
|
[navigationItems addObject:self.rightPanelButton];
|
||||||
}
|
}
|
||||||
|
NSArray *extraButtons = [self additionalRightButtonsForViewController:viewController];
|
||||||
if (extraButtons) {
|
if (extraButtons) {
|
||||||
[navigationItems addObjectsFromArray:extraButtons];
|
[navigationItems addObjectsFromArray:extraButtons];
|
||||||
}
|
}
|
||||||
@ -440,7 +449,12 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setRightPanelIsAccessible:(BOOL)rightPanelIsAccessible forViewController:(UIViewController *)viewController {
|
- (BOOL)rightPanelStaysExtended {
|
||||||
|
MFNumberOfDrawers numberOfDrawers = [self numberOfDrawersShouldShow:self.transitionWidth];
|
||||||
|
return [self shouldExtendRightPanel:numberOfDrawers] && (numberOfDrawers != MFOneDrawer || self.explictlyShowingPanel != self.leftPanel);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setRightPanelIsAccessible:(BOOL)rightPanelIsAccessible forViewController:(UIViewController *)viewController updateNavigationButtons:(BOOL)updateNavigationButtons {
|
||||||
|
|
||||||
if ([self.rightPanel respondsToSelector:@selector(panelAvailable)]) {
|
if ([self.rightPanel respondsToSelector:@selector(panelAvailable)]) {
|
||||||
self.rightPanelIsAccessible = rightPanelIsAccessible && [self.rightPanel panelAvailable];
|
self.rightPanelIsAccessible = rightPanelIsAccessible && [self.rightPanel panelAvailable];
|
||||||
@ -458,8 +472,7 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Determine if we should show the right panel (extended based on width or from explicit action).
|
// Determine if we should show the right panel (extended based on width or from explicit action).
|
||||||
MFNumberOfDrawers numberOfDrawers = [self numberOfDrawersShouldShow:self.transitionWidth];
|
extended = [self rightPanelStaysExtended];
|
||||||
extended = [self shouldExtendRightPanel:numberOfDrawers] && (numberOfDrawers != MFOneDrawer || self.explictlyShowingPanel != self.leftPanel);
|
|
||||||
if (extended || self.explictlyShowingPanel == self.rightPanel) {
|
if (extended || self.explictlyShowingPanel == self.rightPanel) {
|
||||||
[self showRightPanelAnimated:NO explict:NO];
|
[self showRightPanelAnimated:NO explict:NO];
|
||||||
}
|
}
|
||||||
@ -468,7 +481,10 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
[self.rightPanel resetIconToDefault];
|
[self.rightPanel resetIconToDefault];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[self setRightNavigationItemForViewController:viewController accessible:rightPanelIsAccessible extended:extended];
|
|
||||||
|
if (updateNavigationButtons) {
|
||||||
|
[self setRightNavigationItemForViewController:viewController accessible:rightPanelIsAccessible extended:extended];
|
||||||
|
}
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -918,7 +934,7 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
self.extendedDrawers = MFExtendedDrawerLeft | MFExtendedDrawerRight;
|
self.extendedDrawers = MFExtendedDrawerLeft | MFExtendedDrawerRight;
|
||||||
self.prioritizedExtendedPanel = MFExtendedDrawerLeft;
|
self.prioritizedExtendedPanel = MFExtendedDrawerLeft;
|
||||||
|
|
||||||
self.view.backgroundColor = [UIColor blackColor];
|
self.view.backgroundColor = [UIColor whiteColor];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewDidLayoutSubviews {
|
- (void)viewDidLayoutSubviews {
|
||||||
@ -974,11 +990,15 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)resetDrawers {
|
- (void)resetDrawers {
|
||||||
[self setLeftPanelIsAccessible:self.leftPanelIsAccessible forViewController:self.navigationItemViewController];
|
if ([self.navigationItemViewController respondsToSelector:@selector(splitViewDidReset)]) {
|
||||||
[self setRightPanelIsAccessible:self.rightPanelIsAccessible forViewController:self.navigationItemViewController];
|
[((UIViewController<MVMCoreUIDetailViewProtocol> *)self.navigationItemViewController) splitViewDidReset];
|
||||||
|
} else {
|
||||||
|
[self setLeftPanelIsAccessible:self.leftPanelIsAccessible forViewController:self.navigationItemViewController updateNavigationButtons:YES];
|
||||||
|
[self setRightPanelIsAccessible:self.rightPanelIsAccessible forViewController:self.navigationItemViewController updateNavigationButtons:YES];
|
||||||
|
|
||||||
[self.view setNeedsLayout];
|
[self.view setNeedsLayout];
|
||||||
[self.view layoutIfNeeded];
|
[self.view layoutIfNeeded];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (UIStatusBarStyle)preferredStatusBarStyle {
|
- (UIStatusBarStyle)preferredStatusBarStyle {
|
||||||
@ -1069,6 +1089,7 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
if ([self.rightPanelButton respondsToSelector:@selector(setIconColor:)]) {
|
if ([self.rightPanelButton respondsToSelector:@selector(setIconColor:)]) {
|
||||||
[((UIBarButtonItem <MVMCoreUIPanelButtonProtocol>*)self.rightPanelButton) setIconColor:color];
|
[((UIBarButtonItem <MVMCoreUIPanelButtonProtocol>*)self.rightPanelButton) setIconColor:color];
|
||||||
}
|
}
|
||||||
|
[self.backButton setTintColor:color];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 242 B |
|
Before Width: | Height: | Size: 414 B |
|
Before Width: | Height: | Size: 588 B |
|
Before Width: | Height: | Size: 215 B |
|
Before Width: | Height: | Size: 374 B |
|
Before Width: | Height: | Size: 535 B |
@ -2,17 +2,17 @@
|
|||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"filename" : "back.png",
|
"filename" : "nav_back.png",
|
||||||
"scale" : "1x"
|
"scale" : "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"filename" : "back@2x.png",
|
"filename" : "nav_back@2x.png",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"filename" : "back@3x.png",
|
"filename" : "nav_back@3x.png",
|
||||||
"scale" : "3x"
|
"scale" : "3x"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
BIN
MVMCoreUI/SupportingFiles/Media.xcassets/nav_back.imageset/nav_back.png
vendored
Normal file
|
After Width: | Height: | Size: 183 B |
BIN
MVMCoreUI/SupportingFiles/Media.xcassets/nav_back.imageset/nav_back@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 335 B |
BIN
MVMCoreUI/SupportingFiles/Media.xcassets/nav_back.imageset/nav_back@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 488 B |
@ -2,17 +2,17 @@
|
|||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"filename" : "closeXBlack.png",
|
"filename" : "nav_close.png",
|
||||||
"scale" : "1x"
|
"scale" : "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"filename" : "closeXBlack@2x.png",
|
"filename" : "nav_close@2x.png",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"filename" : "closeXBlack@3x.png",
|
"filename" : "nav_close@3x.png",
|
||||||
"scale" : "3x"
|
"scale" : "3x"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
BIN
MVMCoreUI/SupportingFiles/Media.xcassets/nav_close.imageset/nav_close.png
vendored
Normal file
|
After Width: | Height: | Size: 268 B |
BIN
MVMCoreUI/SupportingFiles/Media.xcassets/nav_close.imageset/nav_close@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 488 B |
BIN
MVMCoreUI/SupportingFiles/Media.xcassets/nav_close.imageset/nav_close@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 738 B |
@ -13,7 +13,7 @@ public extension MVMCoreUICommonViewsUtility {
|
|||||||
/// Add the close button (x) to the top right of the view. TODO: update this logic.
|
/// Add the close button (x) to the top right of the view. TODO: update this logic.
|
||||||
@objc static func addCloseButton(to view: UIView, action: @escaping ButtonAction, centeredVertically: Bool = false) -> Button {
|
@objc static func addCloseButton(to view: UIView, action: @escaping ButtonAction, centeredVertically: Bool = false) -> Button {
|
||||||
let button = Button()
|
let button = Button()
|
||||||
if let image = MVMCoreUIUtility.imageNamed("closeXBlack")?.withRenderingMode(.alwaysTemplate) {
|
if let image = MVMCoreUIUtility.imageNamed("nav_close")?.withRenderingMode(.alwaysTemplate) {
|
||||||
button.setImage(image, for: .normal)
|
button.setImage(image, for: .normal)
|
||||||
}
|
}
|
||||||
button.tintColor = .black
|
button.tintColor = .black
|
||||||
|
|||||||