diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnCompareChanges.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnCompareChanges.swift index bb5f6c11..048bc15c 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnCompareChanges.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnCompareChanges.swift @@ -67,14 +67,17 @@ import Foundation //------------------------------------------------------- // MARK: - Lifecycle //------------------------------------------------------- + open override func setupView() { super.setupView() addMolecule(containingStack) + for molecule in containingStack.stackItems { ((molecule as? StackItem)?.view as? Stack)?.restack() } containingStack.restack() + updateAccessibilityLabel() } //------------------------------------------------------ @@ -96,6 +99,7 @@ import Foundation rightHeadline3.set(with: model.rightHeadline3, delegateObject, additionalData) rightBody.set(with: model.rightBody, delegateObject, additionalData) rightLink.set(with: model.rightLink, delegateObject, additionalData) + updateAccessibilityLabel() } open override func reset() { @@ -113,4 +117,104 @@ import Foundation public override class func estimatedHeight(with molecule: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { return 121 } + + //-------------------------------------------------- + // MARK: - Accessibility + //-------------------------------------------------- + + func updateAccessibilityLabel() { + + let leftHeadline1 = Label.createLabelBoldBodySmall(true) + let leftHeadline2 = Label.createLabelBoldBodySmall(true) + let leftHeadline3 = Label.createLabelBoldBodySmall(true) + let leftBody = Label.createLabelRegularBodySmall(true) + let leftLink = Link() + + let rightHeadline1 = Label.createLabelBoldBodySmall(true) + let rightHeadline2 = Label.createLabelBoldBodySmall(true) + let rightHeadline3 = Label.createLabelBoldBodySmall(true) + let rightBody = Label.createLabelRegularBodySmall(true) + let rightLink = Link() + + var message = "" + + if let eyebrowText = eyebrow.text, !eyebrowText.isEmpty { + message += eyebrowText + ", " + } + + if let headlineText = headline.text, !headlineText.isEmpty { + message += headlineText + ", " + } + + if let bodyText = body.text, !bodyText.isEmpty { + message += bodyText + ", " + } + + if let body2Text = body2.text, !body2Text.isEmpty { + message += body2Text + ", " + } + + if let rightImageLabel = rightImage.accessibilityLabel { + message += rightImageLabel + } + + let leftLinkIsDisplayed = !twoLinkView.leftLink.isHidden + let rightLinkIsDisplayed = !twoLinkView.rightLink.isHidden + + // Both links are displayed + if leftLinkIsDisplayed && rightLinkIsDisplayed { + isAccessibilityElement = false + var views = [UIView]() + + if let eyebrowText = eyebrow.text, !eyebrowText.isEmpty { + views.append(eyebrow) + } + + if let headlineText = headline.text, !headlineText.isEmpty { + views.append(headline) + } + + if let bodyText = body.text, !bodyText.isEmpty { + views.append(body) + } + + if let body2Text = body2.text, !body2Text.isEmpty { + views.append(body2) + } + + views.append(twoLinkView.leftLink) + views.append(twoLinkView.rightLink) + + accessibilityElements = views + return + + } else if leftLinkIsDisplayed { + accessibilityHint = twoLinkView.leftLink.accessibilityHint + accessibilityTraits = twoLinkView.leftLink.accessibilityTraits + message += twoLinkView.leftLink.accessibilityLabel ?? "" + + } else if rightLinkIsDisplayed { + accessibilityHint = twoLinkView.rightLink.accessibilityHint + accessibilityTraits = twoLinkView.rightLink.accessibilityTraits + message += twoLinkView.rightLink.accessibilityLabel ?? "" + + } + + isAccessibilityElement = true + accessibilityLabel = message + } + + open override func accessibilityActivate() -> Bool { + + if isAccessibilityElement { + if !twoLinkView.leftLink.isHidden { + return twoLinkView.leftLink.accessibilityActivate() + } else if !twoLinkView.rightLink.isHidden { + return twoLinkView.rightLink.accessibilityActivate() + } + } + + return false + } + } diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDescription.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDescription.swift index b93fd202..37e0ebf2 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDescription.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDescription.swift @@ -68,6 +68,9 @@ import Foundation leftHeadline.numberOfLines = 1 rightLabel.numberOfLines = 1 rightSubLabel.numberOfLines = 1 + + isAccessibilityElement = true + updateAccessibilityLabel() } //---------------------------------------------------- @@ -83,6 +86,7 @@ import Foundation leftBody.set(with: model.leftBody, delegateObject, additionalData) rightLabel.set(with: model.rightLabel, delegateObject, additionalData) rightSubLabel.set(with: model.rightSubLabel, delegateObject, additionalData) + updateAccessibilityLabel() } open override class func estimatedHeight(with molecule: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { @@ -98,4 +102,31 @@ import Foundation rightLabel.styleRegularBodySmall(true) rightSubLabel.styleRegularBodySmall(true) } + + //---------------------------------------------------- + // MARK: - Accessibility + //---------------------------------------------------- + + func updateAccessibilityLabel() { + + var message = "" + + if let leftHeadline = leftHeadline.text, !leftHeadline.isEmpty { + message += leftHeadline + ", " + } + + if let leftBody = leftBody.text, !leftBody.isEmpty { + message += leftBody + ", " + } + + if let rightLabel = rightLabel.text, !rightLabel.isEmpty { + message += rightLabel + ", " + } + + if let rightSubLabel = rightSubLabel.text, !rightSubLabel.isEmpty { + message += rightSubLabel + } + + accessibilityLabel = message + } } diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDetails.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDetails.swift index 7bca7944..29ee94ba 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDetails.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDetails.swift @@ -31,6 +31,8 @@ import UIKit containerHelper.constrainView(view) rightLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 900), for: .horizontal) rightLabel.setContentHuggingPriority(.defaultHigh, for: .vertical) + isAccessibilityElement = true + updateAccessibilityLabel() } open override func updateView(_ size: CGFloat) { @@ -50,6 +52,7 @@ import UIKit leftLabel.set(with: model.leftLabel, delegateObject, additionalData) rightLabel.set(with: model.rightLabel, delegateObject, additionalData) + updateAccessibilityLabel() } open override func reset() { @@ -63,4 +66,23 @@ import UIKit open override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { return 15 } + + //---------------------------------------------------- + // MARK: - Accessibility + //---------------------------------------------------- + + func updateAccessibilityLabel() { + + var message = "" + + if let leftLabel = leftLabel.text, !leftLabel.isEmpty { + message += leftLabel + ", " + } + + if let rightLabel = rightLabel.text, !rightLabel.isEmpty { + message += rightLabel + } + + accessibilityLabel = message + } }