Skip to content

Commit

Permalink
Add support for back button accessibility trait. (#219)
Browse files Browse the repository at this point in the history
* adding back button trait
  • Loading branch information
RoyalPineapple authored Nov 7, 2024
1 parent 4ea8cbf commit e0ec1c6
Show file tree
Hide file tree
Showing 14 changed files with 175 additions and 9 deletions.
4 changes: 4 additions & 0 deletions Example/AccessibilitySnapshot.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
66E2CD14CD63946657E17B15 /* Pods_SnapshotTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A3192D7B9B16BD10FB517A2 /* Pods_SnapshotTests.framework */; };
83A295842AC22D9D00DFBE4F /* UserInputLabelsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A295832AC22D9D00DFBE4F /* UserInputLabelsViewController.swift */; };
83A295862AC22EEE00DFBE4F /* UserInputLabelsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A295852AC22EEE00DFBE4F /* UserInputLabelsTests.swift */; };
AC5C5FE22C627DA300E1C4E7 /* NavBarBackButtonAccessibilityTraitsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC5C5FE12C627DA300E1C4E7 /* NavBarBackButtonAccessibilityTraitsViewController.swift */; };
AC725B842B06D07E009AD59B /* AccessibilityCustomContentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC725B832B06D07E009AD59B /* AccessibilityCustomContentViewController.swift */; };
C47F6C5316FB0C043BEB59F3 /* Pods_AccessibilitySnapshotDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A886964D2E787399E137105 /* Pods_AccessibilitySnapshotDemo.framework */; };
D2F76EED2945C879000A453F /* HitTargetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F76EEC2945C879000A453F /* HitTargetTests.swift */; };
Expand Down Expand Up @@ -149,6 +150,7 @@
83A295832AC22D9D00DFBE4F /* UserInputLabelsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserInputLabelsViewController.swift; sourceTree = "<group>"; };
83A295852AC22EEE00DFBE4F /* UserInputLabelsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserInputLabelsTests.swift; sourceTree = "<group>"; };
88C33CBF672C290CE1EE86AF /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
AC5C5FE12C627DA300E1C4E7 /* NavBarBackButtonAccessibilityTraitsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavBarBackButtonAccessibilityTraitsViewController.swift; sourceTree = "<group>"; };
AC725B832B06D07E009AD59B /* AccessibilityCustomContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityCustomContentViewController.swift; sourceTree = "<group>"; };
C78F90CE7A2A315AADF80144 /* Pods-SnapshotTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SnapshotTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SnapshotTests/Pods-SnapshotTests.debug.xcconfig"; sourceTree = "<group>"; };
CCFF2A604706B71DC0CBD38B /* Pods-AccessibilitySnapshotDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AccessibilitySnapshotDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-AccessibilitySnapshotDemo/Pods-AccessibilitySnapshotDemo.release.xcconfig"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -195,6 +197,7 @@
3F8E5DB82535B25000276B32 /* SwiftUIView.swift */,
3FEF854E253846420072611F /* SwiftUIViewWithScrollView.swift */,
3D39BFAB223314C1009C3EF4 /* TabBarViewController.swift */,
AC5C5FE12C627DA300E1C4E7 /* NavBarBackButtonAccessibilityTraitsViewController.swift */,
3D04B6D821155942006218A4 /* LabelAccessibilityPropertiesViewController.swift */,
3D04B6DA21155D92006218A4 /* ButtonAccessibilityTraitsViewController.swift */,
3D9894F8213509C8006C16F6 /* DescriptionEdgeCasesViewController.swift */,
Expand Down Expand Up @@ -647,6 +650,7 @@
3DDE7FF624C6D6BF00999ABA /* AccessibilityCustomActionsViewController.swift in Sources */,
3DBAC28F2242E7C700EF4D0A /* ListContainerViewController.swift in Sources */,
AC725B842B06D07E009AD59B /* AccessibilityCustomContentViewController.swift in Sources */,
AC5C5FE22C627DA300E1C4E7 /* NavBarBackButtonAccessibilityTraitsViewController.swift in Sources */,
3DBEAA5B2222953E00FAE61D /* SwitchControlViewController.swift in Sources */,
3DBAC2912242F9B200EF4D0A /* LandmarkContainerViewController.swift in Sources */,
1104A8CF2B580AC500B6715F /* SwiftUITextEntry.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
//
// Copyright 2024 Square Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

import Paralayout
import UIKit

final class NavBarBackButtonAccessibilityTraitsViewController: AccessibilityViewController {

// MARK: - Public Properties

init(titles: [String?] = [nil, nil]) {
self.titles = titles
super.init(nibName: nil, bundle: nil)
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

var titles: [String?]

// MARK: - Private Properties

private var rootView: View {
return view as! View
}

// MARK: - UIViewController

override func loadView() {
view = View(titles: titles)
}
}

// MARK: -

extension NavBarBackButtonAccessibilityTraitsViewController {

final class Child: UIViewController {

init(_ title: String? = nil) {
super.init(nibName: nil, bundle: nil)
self.title = title
}

required init?(coder: NSCoder) {
super.init(coder: coder)
}
let label = UILabel()

override func viewDidLoad() {
super.viewDidLoad()
navigationItem.hidesBackButton = false

label.text = "Back Button Accessibility Traits - "
label.text?.append(hasTitle ? "With Titles" : "Without Titles" )
view.addSubview(label)
}
private var hasTitle: Bool {
self.title != nil
}

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
label.sizeToFit()
let x = (view.bounds.width / 2) - (label.frame.size.width / 2)
let y = (view.bounds.height / 2) - (label.frame.size.height / 2)
label.frame = CGRect(origin: CGPoint(x: x, y: y), size: label.frame.size)
}
}
}

extension NavBarBackButtonAccessibilityTraitsViewController {

final class View: UIView {

// MARK: - Life Cycle

init(titles: [String?]) {
self.titles = titles
super.init(frame: .zero)
addSubview(navView)
navController.viewControllers = titles.map { Child($0) }
}

@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

// MARK: - Public Properties
var titles: [String?]

let navController = UINavigationController()
var navView: UIView {
navController.view
}



// MARK: - Private Properties

// MARK: - UIView

override func layoutSubviews() {
super.layoutSubviews()
navView.frame = bounds
}


}

}
1 change: 1 addition & 0 deletions Example/AccessibilitySnapshot/RootViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ final class RootViewController: UITableViewController {
var accessibilityScreens = [
("View Accessibility Properties", { _ in return ViewAccessibilityPropertiesViewController() }),
("Label Accessibility Properties", { _ in return LabelAccessibilityPropertiesViewController() }),
("Nav Bar Back Button Accessibility Traits", { _ in return NavBarBackButtonAccessibilityTraitsViewController() }),
("Button Accessibility Traits", { _ in return ButtonAccessibilityTraitsViewController() }),
("Default UIKit Controls", { _ in return DefaultControlsViewController() }),
("UISwitch Controls", { _ in return SwitchControlViewController() }),
Expand Down
12 changes: 12 additions & 0 deletions Example/SnapshotTests/AccessibilityPropertiesTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,18 @@ final class AccessibilitySnapshotTests: SnapshotTestCase {
buttonTraitsViewController.view.frame = UIScreen.main.bounds
SnapshotVerifyAccessibility(buttonTraitsViewController.view)
}

func testNavBarBackButtonTraitsWithTitles() {
let navBarBackButtonTraitsViewController = NavBarBackButtonAccessibilityTraitsViewController(titles: ["First", "Second"])
navBarBackButtonTraitsViewController.view.frame = UIScreen.main.bounds
SnapshotVerifyAccessibility(navBarBackButtonTraitsViewController.view)
}
func testNavBarBackButtonTraitsWithoutTitles() {
let navBarBackButtonTraitsViewController = NavBarBackButtonAccessibilityTraitsViewController()
navBarBackButtonTraitsViewController.view.frame = UIScreen.main.bounds

SnapshotVerifyAccessibility(navBarBackButtonTraitsViewController.view)
}

func testSwitchControls() {
let switchControlViewController = SwitchControlViewController()
Expand Down
Binary file added ...ssibilitySnapshotTests/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ...ssibilitySnapshotTests/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ...ssibilitySnapshotTests/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ...bilitySnapshotTests/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ...bilitySnapshotTests/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ...bilitySnapshotTests/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
/* Description for the 'button' accessibility trait */
"trait.button.description" = "Taste.";

/* Description for the 'back button' accessibility trait */
"trait.backbutton.description" = "Zurück Taste.";

/* Description for the 'tab' accessibility trait */
"trait.tab.description" = "Tabulator.";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
/* Description for the 'button' accessibility trait */
"trait.button.description" = "Button.";

/* Description for the 'back button' accessibility trait */
"trait.backbutton.description" = "Back Button.";

/* Description for the 'tab' accessibility trait */
"trait.tab.description" = "Tab.";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
/* Description for the 'button' accessibility trait */
"trait.button.description" = "Кнопка.";

/* Description for the 'back button' accessibility trait */
"trait.backbutton.description" = "Кнопка назад.";

/* Description for the 'tab' accessibility trait */
"trait.tab.description" = "Вкладка.";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,14 @@ extension NSObject {
}

let hidesButtonTraitInContext = context?.hidesButtonTrait ?? false
let hidesButtonTraitFromTraits = [UIAccessibilityTraits.keyboardKey, .switchButton, .tabBarItem].contains(where: { accessibilityTraits.contains($0) })
let hidesButtonTraitFromTraits = [UIAccessibilityTraits.keyboardKey, .switchButton, .tabBarItem, .backButton].contains(where: { accessibilityTraits.contains($0) })
if accessibilityTraits.contains(.button) && !hidesButtonTraitFromTraits && !hidesButtonTraitInContext {
traitSpecifiers.append(strings.buttonTraitName)
}

if accessibilityTraits.contains(.backButton) {
traitSpecifiers.append(strings.backButtonTraitName)
}

if accessibilityTraits.contains(.switchButton) {
if accessibilityTraits.contains(.button) {
Expand Down Expand Up @@ -319,6 +323,8 @@ extension NSObject {
let notEnabledTraitName: String

let buttonTraitName: String

let backButtonTraitName: String

let tabTraitName: String

Expand Down Expand Up @@ -399,6 +405,11 @@ extension NSObject {
comment: "Description for the 'button' accessibility trait",
locale: locale
)
self.backButtonTraitName = "Back Button.".localized(
key: "trait.backbutton.description",
comment: "Description for the 'back button' accessibility trait",
locale: locale
)
self.tabTraitName = "Tab.".localized(
key: "trait.tab.description",
comment: "Description for the 'tab' accessibility trait",
Expand Down Expand Up @@ -571,15 +582,18 @@ extension String {

extension UIAccessibilityTraits {

static let tabBarItem = UIAccessibilityTraits(rawValue: 0x0000000010000000)

static let switchButton = UIAccessibilityTraits(rawValue: 0x0020000000000000)

static let isEditing = UIAccessibilityTraits(rawValue: 0x0000000000200000)

static let textEntry = UIAccessibilityTraits(rawValue: 0x0000000000040000)
static let textEntry = UIAccessibilityTraits(rawValue: 1 << 18) // 0x0000000000040000

static let isEditing = UIAccessibilityTraits(rawValue: 1 << 21) // 0x0000000000200000

static let backButton = UIAccessibilityTraits(rawValue: 1 << 27) // 0x0000000008000000

static let tabBarItem = UIAccessibilityTraits(rawValue: 1 << 28) // 0x0000000010000000

static let scrollable = UIAccessibilityTraits(rawValue: 1 << 47) // 0x0000800000000000

static let switchButton = UIAccessibilityTraits(rawValue: 1 << 53) //0x0020000000000000

static let scrollable = UIAccessibilityTraits(rawValue: 0x0000800000000000)
}

// MARK: -
Expand Down

0 comments on commit e0ec1c6

Please sign in to comment.