Page 1
© 2014 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.
#WWDC14
Accessibility on OS XNew Accessibility API
Frameworks
Session 207 Patti Hoa Accessibility Engineer
!
Chris Dolan Accessibility Engineer
Page 3
Agenda
Accessibility for everyone
Page 4
Agenda
Accessibility for everyone
Overview of the new Accessibility API
Page 5
Agenda
Accessibility for everyone
Overview of the new Accessibility API
Testing of accessibility changes
Page 6
Agenda
Accessibility for everyone
Overview of the new Accessibility API
Testing of accessibility changes
Demo
Page 11
Feature
VoiceOverZoom
Zoom Window
Speak Selection
Closed Captioning
Slow KeysContrast Enhancements
Flash Screen AlertInvert Colors
Subtitles
Sticky Keys
Mouse KeysCursor ScalingSwitch Control
Speak Auto-text
Large Text
Slow
Page 13
Flow of Accessibility Information
Application
Page 14
Flow of Accessibility Information
Assistive Software Application
Page 15
Flow of Accessibility Information
Assistive Software
Request accessibility information
Application
Page 16
Flow of Accessibility Information
Assistive Software
Vends accessibility information
Request accessibility information
Application
Page 17
Flow of Accessibility Information
ApplicationAssistive Software
Page 18
Flow of Accessibility Information
Accessibility API
ApplicationAssistive Software
Page 19
New Accessibility API on OS X
Page 28
Button Button Button
Page 33
Using AppKit control?
Page 34
Using AppKit control?
Accessibility for free!
Page 38
Adding Label to an AppKit Control
- (void)awakeFromNib { ........ NSButtonCell *myButtonCell = [myLoopButton cell]; myButtonCell.accessibilityLabel = NSLocalizedString(@"play", nil); ........ }
Page 40
Accessibility Properties
Page 41
Accessibility Properties
Majority of attributes are now properties @property (copy) NSString *accessibilityLabel @property NSRect accessibilityFrame
Page 42
Accessibility Properties
Majority of attributes are now properties @property (copy) NSString *accessibilityLabel @property NSRect accessibilityFrame
Subclasses no longer needed searchField.accessibilityLabel = NSLocalizedString(@"play", nil); searchField.accessibilityLinkedUIElements = @[content];
Page 45
Accessibility Protocols
Guide developers through implementation
Covers most common types of UI
Page 46
Pick a Protocol
Button
CheckBox
Group
Image
StaticText
Stepper
…
Page 47
Implement the Protocol
@interface MyButtonView : NSView <NSAccessibilityButton> @end
Page 48
Implement the Protocol
@interface MyButtonView : NSView <NSAccessibilityButton> @end
Page 49
Implement the Protocol
Page 50
Implement the Protocol
@implementation MyButtonView - (NSString *)accessibilityLabel { return NSLocalizedStringForKey(@“play”, nil); } - (BOOL)accessibilityPerformPress { [self press]; return YES; } @end !
Page 51
Implement the Protocol
@implementation MyButtonView - (NSString *)accessibilityLabel { return NSLocalizedStringForKey(@“play”, nil); } - (BOOL)accessibilityPerformPress { [self press]; return YES; } @end !
That is all!
Page 52
AppKit Infers More
Page 53
AppKit Infers More
Infer isAccessibilityElement
Page 54
AppKit Infers More
Infer isAccessibilityElement
Auto-populate some attributes
Page 56
@protocol NSAccessibilityElement <NSObject> @required - (NSRect)accessibilityFrame; - (id)accessibilityParent; @end
Protocols
Page 57
@protocol NSAccessibilityElement <NSObject> @required - (NSRect)accessibilityFrame; - (id)accessibilityParent; @end
@protocol NSAccessibilityButton <NSAccessibilityElement> @required - (NSString *)accessibilityLabel; - (BOOL)accessibilityPerformPress; @end
Protocols
Page 61
NSAccessibilityElementUI without backing NSView
Page 62
- (NSArray *)accessibilityChildren {
if ( _accessibilityChildren == nil ) {
...
[_accessibilityChildren addObject:imageElement];
}
return _accessibilityChildren;
}
NSAccessibilityElement
NSAccessibilityElement *imageElement = [NSAccessibilityElement new];
NSRect bounds = NSAccessibilityFrameInView(self, [self imageBounds]);
[imageElement setAccessibilityParent:self];
[imageElement setAccessibilityRole:NSAccessibilityImageRole];
[imageElement setAccessibilityLabel:accessibilityLabel];
[imageElement setAccessibilityFrame:bounds];
Page 63
- (NSArray *)accessibilityChildren {
if ( _accessibilityChildren == nil ) {
...
[_accessibilityChildren addObject:imageElement];
}
return _accessibilityChildren;
}
NSAccessibilityElement
NSAccessibilityElement *imageElement = [NSAccessibilityElement new];
NSRect bounds = NSAccessibilityFrameInView(self, [self imageBounds]);
[imageElement setAccessibilityParent:self];
[imageElement setAccessibilityRole:NSAccessibilityImageRole];
[imageElement setAccessibilityLabel:accessibilityLabel];
[imageElement setAccessibilityFrame:bounds];
Page 64
- (NSArray *)accessibilityChildren {
if ( _accessibilityChildren == nil ) {
...
[_accessibilityChildren addObject:imageElement];
}
return _accessibilityChildren;
}
NSAccessibilityElement
NSAccessibilityElement *imageElement = [NSAccessibilityElement new];
NSRect bounds = NSAccessibilityFrameInView(self, [self imageBounds]);
[imageElement setAccessibilityParent:self];
[imageElement setAccessibilityRole:NSAccessibilityImageRole];
[imageElement setAccessibilityLabel:accessibilityLabel];
[imageElement setAccessibilityFrame:bounds];
Page 65
- (NSArray *)accessibilityChildren {
if ( _accessibilityChildren == nil ) {
...
[_accessibilityChildren addObject:imageElement];
}
return _accessibilityChildren;
}
NSAccessibilityElement
NSAccessibilityElement *imageElement = [NSAccessibilityElement new];
NSRect bounds = NSAccessibilityFrameInView(self, [self imageBounds]);
[imageElement setAccessibilityParent:self];
[imageElement setAccessibilityRole:NSAccessibilityImageRole];
[imageElement setAccessibilityLabel:accessibilityLabel];
[imageElement setAccessibilityFrame:bounds];
Page 66
- (NSArray *)accessibilityChildren {
if ( _accessibilityChildren == nil ) {
...
[_accessibilityChildren addObject:imageElement];
}
return _accessibilityChildren;
}
NSAccessibilityElement
NSAccessibilityElement *imageElement = [NSAccessibilityElement new];
NSRect bounds = NSAccessibilityFrameInView(self, [self imageBounds]);
[imageElement setAccessibilityParent:self];
[imageElement setAccessibilityRole:NSAccessibilityImageRole];
[imageElement setAccessibilityLabel:accessibilityLabel];
[imageElement setAccessibilityFrame:bounds];
Page 67
Already implemented accessibility?
Page 68
Already implemented accessibility?
No extra work!
Page 69
Binary and source compatible
Page 70
Agenda
Accessibility for everyone
Overview of the new Accessibility API
Page 72
Accessibility Inspector
Page 78
“Heading”
“⠓⠑⠁⠙⠊⠝⠛”
Page 82
VoiceOver Commands
Page 83
VoiceOver Commands
Next Item: control option⌃ ⌥
Page 84
VoiceOver Commands
Next Item: control option⌃ ⌥
Previous Item: control option⌃ ⌥
Page 85
VoiceOver Commands
Next Item: control option⌃ ⌥
Previous Item: control option⌃ ⌥
Activate Item: control option⌃ ⌥ space
Page 86
VoiceOver Commands
Next Item: control option⌃ ⌥
Previous Item: control option⌃ ⌥
Activate Item: control option⌃ ⌥ space
Enter Group: control option⌃ ⌥ shift
Page 87
VoiceOver Commands
Next Item: control option⌃ ⌥
Previous Item: control option⌃ ⌥
Activate Item: control option⌃ ⌥ space
Enter Group: control option⌃ ⌥ shift
Leave Group:control option⌃ ⌥ shift
Page 90
VoiceOver Commands
Next Item: control option⌃ ⌥
Previous Item: control option⌃ ⌥
Activate Item: control option⌃ ⌥ space
Enter Group: control option⌃ ⌥ shift
Leave Group:control option⌃ ⌥ shift
Page 91
DemoTic Tac Toe
Chris Dolan Accessibility Engineer
Page 92
http://developer.apple.com
Page 93
Summary
Brand new, easy to use API
Test with VoiceOver, Accessibility Inspector
Developer examples
Page 94
More Information
Jake Behrens App Frameworks Evangelist [email protected]
Documentation http://developer.apple.com
Apple Developer Forums http://devforums.apple.com
Page 95
• Accessibility on iOS Russian Hill Tuesday 3:15PM
• Improving the Accessibility and Usability of Complex Web Applications
Marina Friday 9:00AM
Related Sessions
Page 96
Labs
• Accessibility and Speech Lab Frameworks Lab B Wednesday 10:15AM