Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 20 additions & 11 deletions Documentation/Accessibility/Pages/Advanced Usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,19 +62,28 @@ By this way you can add any other functionality to accessibility items.

## Customize invalidation

If you want to perform additional logic on invalidate, you can define your own methods from `AccessibilityInvalidatable` protocol and set implemented `AccessibilityItemInvalidator` inside.

### in table or collection
If you want to perform additional logic on invalidate, you can implement your own `AccessibilityItemInvalidator` and set `AccessibilityInvalidatorCreationBlock`

**For example**
```swift
public protocol AccessibilityItemInvalidator {
func invalidateParameters()
}

public protocol AccessibilityInvalidatable: AccessibilityItem {
var accessibilityInvalidator: AccessibilityItemInvalidator? { get set }
private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: .accessibility({ item, kind, delegate in
return CustomInvalidator(item, kind, delegate)
}))
.build()
```

func setInvalidator(kind: AccessibilityItemKind, delegate: AccessibilityItemDelegate?)
*Note that we have `DelegatedAccessibilityItemInvalidator` which could be used as base for your custom invalidator. This class is needed to combine strategies from item and generator.*

func removeInvalidator()
}
```
There is a delegate to collection or table delegate to call `didInvalidateAccessibility` on it with provided parameter `AccessibilityItemKind`. This kind contains additonal info about the accessibility item which is required for invalidation mechanism.
### in other view

Any view can implement `AccessibilityItem`, but you need adittionaly call `AccessibilityItem.modifySelf()` to setup accessibility-properties for real.

`AcessibilityInvalidatable.setBasicInvalidator` is also available for invalidation.

*Note that is recomended to call*
- `setBasicInvalidator` when view become **visible**
- `removeInvalidator` when view become **invisible**
78 changes: 52 additions & 26 deletions Documentation/Accessibility/Pages/Usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,17 @@ To make your App more friendly for disabled users **RDDM** provides a set of ins

By default, all cells inside tables and collections are not accessibility elements, that can add difficult to users to navigate and read them. Despite this fact, many accessibility consultants recommend to make cells a single accessibility element.

**RDDM** in initial will not make any changes to accessibility elements hierarchy, so you can manage your own optimization. But it enables an accessibility plugin at all builders to be work with `AccessibilityItems`.
**RDDM** in initial will not make any changes to accessibility elements hierarchy, so you can manage your own optimization.

To enable accessibility plugin you need to add it to builder

*like below*
```swift

private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: .accessibility())
.build()
```

You can see how the accessibility plugin works in the Example project. It completely includes all basic usage.

Expand Down Expand Up @@ -113,6 +123,45 @@ var traitsStrategy: AccessibilityTraitsStrategy { .from(object: button) }
***
<br><br>

#### AccessibilityActionsStrategy

This strategy is used for [custom actions](./UIAccessibility%20Basics.md#accessibilitycustomactions).

*Note: all system actions such as swipes, editing, moving, drag and drop are already provided by UIKit in another way. Use this actions provider to add custom interaction with the cell content.*

*Static values*
- `.ignored` - value will not be changed by this strategy.
- `.just([AccessibilityAction])` - array of actions.

*Mutation functions*
- `.append(AccessibilityAction)` - appending existing array of actions
- `.remove(AccessibilityAction)` - removing action from array
- `.removeAll()` - removing all actions from current array

*Example:*
```swift
actionsStrategy = .just([])

if isEditable {

actionsStrategy.append(.selector(name: "Buy",
target: nil,
selector: #selector(buyMethod)))
actionsStrategy.append(.closure(name: "Add to favorite", handler: {
// do something
}))
actionsStrategy.append(.closure(name: "Delete", handler: onDeleteTapped))


} else {
actionsStrategy.removeAll()
}
```

*Note that closure based init is available only from iOS 13*

<br>

## Providers

Providers in **RDDM** is a separate parameters containers which are included in `AccessibilityItem`. But these providers can be used for generators to combine them with cell's parameters.
Expand All @@ -130,6 +179,7 @@ public protocol AccessibilityStrategyProvider {
var labelStrategy: AccessibilityStringStrategy { get }
var valueStrategy: AccessibilityStringStrategy { get }
var traitsStrategy: AccessibilityTraitsStrategy { get }
var actionsStrategy: AccessibilityActionsStrategy { get }
var isAccessibilityIgnored: Bool { get }
}
```
Expand All @@ -146,31 +196,7 @@ extension SelectableItem: AccessibilityStrategyProvider {
}
```

`labelStrategy` and `traitsStrategy` is required parameters and `valueStrategy` is `.ignored` by default.

<br>

#### AccessibilityActionsProvider

A provider for [custom actions](./UIAccessibility%20Basics.md#accessibilitycustomactions). In item is defined as empty array.

```swift
public protocol AccessibilityActionsProvider {
func accessibilityActions() -> [UIAccessibilityCustomAction]
}
```

*Note: all system actions such as swipes, editing, moving, drag and drop are already provided by UIKit in another way. Use this actions provider to add custom interaction with the cell content.*

*Example:*
```swift
func accessibilityActions() -> [UIAccessibilityCustomAction] {
let switchAction = UIAccessibilityCustomAction(name: "Toggle animated",
target: self,
selector: #selector(accessibilityActivateSwitch))
return [switchAction]
}
```
`labelStrategy` and `traitsStrategy` is required parameters but `valueStrategy` and `actionsStrategy` is `.ignored` by default.

<br>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ final class AlignedCollectionViewController: UIViewController {
// MARK: - Private Properties

private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: .accessibility())
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Этот контроллер не рабочий

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В каком плане?
По a11y там минимальная адаптация с указанием "some image".
Там layout который к левой или к правой стороне прижимает. И больше никакой логики.

Simulator Screenshot - iPhone 14 Pro - 2023-07-21 at 12 52 36

Simulator Screenshot - iPhone 14 Pro - 2023-07-21 at 12 53 02

Или в прошлых версиях iOS другой эффект был?

.build()

// MARK: - UIViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ final class CarouselCollectionViewController: UIViewController {
// MARK: - Private Properties

private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: .accessibility())
.build()

// MARK: - UIViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ final class CollectionCompositionalViewController: UIViewController {

private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: prefetcherablePlugin)
.add(plugin: .accessibility())
.build()

// MARK: - UIViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class CollectionListViewController: UIViewController {

private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: .selectable())
.add(plugin: .accessibility())
.build()

private var titles = ["Item 1", "Item 2", "Item 3", "Item 4"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class CollectionViewController: UIViewController {
.set(delegate: FlowCollectionDelegate())
.add(plugin: .selectable())
.add(plugin: .highlightable())
.add(plugin: .accessibility())
.build()

private lazy var titles: [String] = ["One", "Two", "Three", "Four"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ final class DiffableCollectionViewController: UIViewController {

private lazy var adapter = collectionView.rddm.baseBuilder
.set(dataSource: { DiffableCollectionDataSource(provider: $0) })
.add(plugin: .accessibility())
.build()

private var generators: [DiffableCollectionCellGenerator] = []
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ final class DifferenceCollectionViewController: UIViewController {

// MARK: - Private Properties

private lazy var adapter = collectionView.rddm.baseBuilder.build()
private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: .accessibility())
.build()

private var generators: [DiffableCollectionCellGenerator] = []

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ final class DragAndDroppableCollectionViewController: UIViewController {
.add(featurePlugin: .dragAndDroppable(by: .current, draggableParameters: draggableParameters, positionChanged: {
print($0.id ?? "")
}))
.add(plugin: .accessibility())
.build()

// MARK: - UIViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ final class DynamicHeightViewController: UIViewController {

// MARK: - Private Properties

private lazy var adapter = tableView.rddm.manualBuilder.build()
private lazy var adapter = tableView.rddm.manualBuilder
.add(plugin: .accessibility())
.build()

// MARK: - UIViewController

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ final class FoldableCollectionViewController: UIViewController {

private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: .foldable())
.add(plugin: .accessibility())
.build()

private var appearance: Appearance = .grid
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ final class ImageCollectionViewController: UIViewController {
// MARK: - Private Properties

private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: .accessibility())
.build()

// MARK: - UIViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ final class ImageHorizontalCollectionViewController: UIViewController {
private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: .scrollableBehaviour(scrollProvider: scrollManager))
.add(plugin: .scrollOnSelect(to: .centeredHorizontally))
.add(plugin: .accessibility())
.build()

// MARK: - UIViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class ItemTitleCollectionViewController: UIViewController {
private lazy var adapter = collectionView.rddm.baseBuilder
.set(delegate: FlowCollectionDelegate())
.add(featurePlugin: .sectionTitleDisplayable())
.add(plugin: .accessibility())
.build()

// MARK: - UIViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ final class MainCollectionViewController: UIViewController {

private lazy var adapter = tableView.rddm.manualBuilder
.add(plugin: .selectable())
.add(plugin: .accessibility())
.build()

// MARK: - UIViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ final class MovableCollectionViewController: UIViewController {
private lazy var adapter = collectionView.rddm.baseBuilder
.set(delegate: FlowCollectionDelegate())
.add(featurePlugin: .movable(cellDidChangePosition: { print($0.id ?? "") }))
.add(plugin: .accessibility())
.build()

// MARK: - UIViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ final class PaginatableCollectionViewController: UIViewController {

private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: .paginatable(progressView: progressView, output: self))
.add(plugin: .accessibility())
.build()

private weak var paginatableInput: PaginatableInput?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ final class PrefetchingCollectionViewController: UIViewController {

private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: prefetcherablePlugin)
.add(plugin: .accessibility())
.build()

// MARK: - UIViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ final class RefreshableCollectionViewController: UIViewController {

private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: .refreshable(refreshControl: refreshControl, output: self))
.add(plugin: .accessibility())
.build()

// MARK: - UIViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ final class SizableCollectionViewController: UIViewController {

private lazy var adapter = collectionView.rddm.baseBuilder
.set(delegate: FlowCollectionDelegate())
.add(plugin: .accessibility())
.build()

// MARK: - UIViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ final class SwipeableCollectionListViewController: UIViewController {
private lazy var plugin = CollectionSwipeActionsConfigurationPlugin(swipeProvider: swipeProvider)
private lazy var adapter = collectionView.rddm.baseBuilder
.add(featurePlugin: plugin)
.add(plugin: .accessibility())
.build()

private var appearance = UICollectionLayoutListConfiguration.Appearance.plain
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ final class DynamicHeightTableViewCell: UITableViewCell, ConfigurableItem, Const

// MARK: - Private Properties

private lazy var adapter = collectionView.rddm.baseBuilder.build()
private lazy var adapter = collectionView.rddm.baseBuilder
.add(plugin: .accessibility())
.build()

// MARK: - UITableViewCell

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ extension FittingCompressedSizeCollectionViewCell: ConfigurableItem {

extension FittingCompressedSizeCollectionViewCell: AccessibilityItem {

var labelStrategy: AccessibilityStringStrategy { .from(object: titleLabel) }
var traitsStrategy: AccessibilityTraitsStrategy { .from(object: titleLabel) }
var labelStrategy: AccessibilityStringStrategy { .from(titleLabel) }
var traitsStrategy: AccessibilityTraitsStrategy { .from(titleLabel) }

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ extension FoldableCollectionViewCell: ConfigurableItem {
extension FoldableCollectionViewCell: AccessibilityItem {

var labelStrategy: AccessibilityStringStrategy { .just("Expandable item") }
var traitsStrategy: AccessibilityTraitsStrategy { .just(.none) }
var traitsStrategy: AccessibilityTraitsStrategy { .just(Optional.none) }

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ extension SizableCollectionViewCell: CalculatableHeightItem {

extension SizableCollectionViewCell: AccessibilityItem {

var labelStrategy: AccessibilityStringStrategy { .from(object: titleLabel) }
var traitsStrategy: AccessibilityTraitsStrategy { .from(object: titleLabel) }
var labelStrategy: AccessibilityStringStrategy { .from(titleLabel) }
var traitsStrategy: AccessibilityTraitsStrategy { .from(titleLabel) }

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ class TitleCollectionListCell: UICollectionViewCell, ConfigurableItem, Accessibi

// MARK: - AccessibilityItem

var labelStrategy: AccessibilityStringStrategy { .from(object: titleLabel) }
var traitsStrategy: AccessibilityTraitsStrategy { .from(object: titleLabel) }
var labelStrategy: AccessibilityStringStrategy { .from(titleLabel) }
var traitsStrategy: AccessibilityTraitsStrategy { .from(titleLabel) }

// MARK: - Configurable

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ final class TitleCollectionViewCell: UICollectionViewCell, AccessibilityInvalida

// MARK: - AccessibilityInvalidatable

var labelStrategy: AccessibilityStringStrategy { .from(object: titleLabel) }
var labelStrategy: AccessibilityStringStrategy { .from(titleLabel) }
var valueStrategy: AccessibilityStringStrategy = .just(nil)
lazy var traitsStrategy: AccessibilityTraitsStrategy = .from(object: titleLabel)
lazy var traitsStrategy: AccessibilityTraitsStrategy = .from(titleLabel)
var shouldOverrideStateTraits: Bool { true }

var accessibilityInvalidator: AccessibilityItemInvalidator?
Expand Down Expand Up @@ -54,7 +54,7 @@ extension TitleCollectionViewCell: HighlightableItem {

func applyHighlightedStyle() {
contentView.backgroundColor = .white.withAlphaComponent(0.5)
updateState(state: "Highlighted", isSelected: false)
updateState(state: "Highlighted", isSelected: true)
}

func applySelectedStyle() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ class TitleIconCollectionFooterView: UICollectionReusableView, AccessibilityItem

// MARK: - AccessibilityItem

var labelStrategy: AccessibilityStringStrategy { .joined([.just("some image with title: "), .from(object: titleLabel)]) }
var traitsStrategy: AccessibilityTraitsStrategy { .merge([iconImageView, titleLabel]) }
var labelStrategy: AccessibilityStringStrategy { .merge("some image with title: ", titleLabel.text) }
var traitsStrategy: AccessibilityTraitsStrategy { .merge(iconImageView, titleLabel) }

// MARK: - Internal methods

Expand Down
Loading