Add support for newly added a11y properties in iOS 8 / 9 and tvOS

New a11y properties:
- accessibilityNavigationStyle
- accessibilityHeaderElements
- accessibilityActivationPoint
- accessibilityPath
This commit is contained in:
Michael Schneider 2016-04-07 15:00:47 -07:00
parent b284d3f606
commit 28c4fede57
5 changed files with 158 additions and 1 deletions

View File

@ -711,6 +711,13 @@ NS_ASSUME_NONNULL_END
@property (atomic, assign) BOOL accessibilityViewIsModal; @property (atomic, assign) BOOL accessibilityViewIsModal;
@property (atomic, assign) BOOL shouldGroupAccessibilityChildren; @property (atomic, assign) BOOL shouldGroupAccessibilityChildren;
@property (nonatomic) UIAccessibilityNavigationStyle accessibilityNavigationStyle NS_AVAILABLE_IOS(8_0);
#if TARGET_OS_TV
@property(nullable, nonatomic, copy) NSArray *accessibilityHeaderElements;
#endif
@property (nonatomic) CGPoint accessibilityActivationPoint;
@property (nullable, nonatomic, copy) UIBezierPath *accessibilityPath;
// Accessibility identification support // Accessibility identification support
@property (nullable, nonatomic, copy) NSString *accessibilityIdentifier; @property (nullable, nonatomic, copy) NSString *accessibilityIdentifier;

View File

@ -865,6 +865,56 @@ nodeProperty = nodeValueExpr; _setToViewOnly(viewAndPendingViewStateProperty, vi
_setAccessibilityToViewAndProperty(_accessibilityIdentifier, accessibilityIdentifier, accessibilityIdentifier, accessibilityIdentifier); _setAccessibilityToViewAndProperty(_accessibilityIdentifier, accessibilityIdentifier, accessibilityIdentifier, accessibilityIdentifier);
} }
- (void)setAccessibilityNavigationStyle:(UIAccessibilityNavigationStyle)accessibilityNavigationStyle
{
_bridge_prologue_write;
_setAccessibilityToViewAndProperty(_accessibilityNavigationStyle, accessibilityNavigationStyle, accessibilityNavigationStyle, accessibilityNavigationStyle);
}
- (UIAccessibilityNavigationStyle)accessibilityNavigationStyle
{
_bridge_prologue_read;
return _getAccessibilityFromViewOrProperty(_accessibilityNavigationStyle, accessibilityNavigationStyle);
}
#if TARGET_OS_TV
- (void)setAccessibilityHeaderElements:(NSArray *)accessibilityHeaderElements
{
_bridge_prologue_write;
_setAccessibilityToViewAndProperty(_accessibilityHeaderElements, accessibilityHeaderElements, accessibilityHeaderElements, accessibilityHeaderElements);
}
- (NSArray *)accessibilityHeaderElements
{
_bridge_prologue_read;
return _getAccessibilityFromViewOrProperty(_accessibilityHeaderElements, accessibilityHeaderElements);
}
#endif
- (void)setAccessibilityActivationPoint:(CGPoint)accessibilityActivationPoint
{
_bridge_prologue_write;
_setAccessibilityToViewAndProperty(_accessibilityActivationPoint, accessibilityActivationPoint, accessibilityActivationPoint, accessibilityActivationPoint);
}
- (CGPoint)accessibilityActivationPoint
{
_bridge_prologue_read;
return _getAccessibilityFromViewOrProperty(_accessibilityActivationPoint, accessibilityActivationPoint);
}
- (void)setAccessibilityPath:(UIBezierPath *)accessibilityPath
{
_bridge_prologue_write;
_setAccessibilityToViewAndProperty(_accessibilityPath, accessibilityPath, accessibilityPath, accessibilityPath);
}
- (UIBezierPath *)accessibilityPath
{
_bridge_prologue_read;
return _getAccessibilityFromViewOrProperty(_accessibilityPath, accessibilityPath);
}
- (NSInteger)accessibilityElementCount - (NSInteger)accessibilityElementCount
{ {
_bridge_prologue_read; _bridge_prologue_read;

View File

@ -141,6 +141,10 @@ FOUNDATION_EXPORT NSString * const ASRenderingEngineDidDisplayNodesScheduledBefo
BOOL _accessibilityViewIsModal; BOOL _accessibilityViewIsModal;
BOOL _shouldGroupAccessibilityChildren; BOOL _shouldGroupAccessibilityChildren;
NSString *_accessibilityIdentifier; NSString *_accessibilityIdentifier;
UIAccessibilityNavigationStyle _accessibilityNavigationStyle;
NSArray *_accessibilityHeaderElements;
CGPoint _accessibilityActivationPoint;
UIBezierPath *_accessibilityPath;
#if TIME_DISPLAYNODE_OPS #if TIME_DISPLAYNODE_OPS
@public @public

View File

@ -67,6 +67,10 @@ typedef struct {
int setAccessibilityViewIsModal:1; int setAccessibilityViewIsModal:1;
int setShouldGroupAccessibilityChildren:1; int setShouldGroupAccessibilityChildren:1;
int setAccessibilityIdentifier:1; int setAccessibilityIdentifier:1;
int setAccessibilityNavigationStyle:1;
int setAccessibilityHeaderElements:1;
int setAccessibilityActivationPoint:1;
int setAccessibilityPath:1;
} ASPendingStateFlags; } ASPendingStateFlags;
@implementation _ASPendingState @implementation _ASPendingState
@ -106,6 +110,10 @@ typedef struct {
BOOL accessibilityViewIsModal; BOOL accessibilityViewIsModal;
BOOL shouldGroupAccessibilityChildren; BOOL shouldGroupAccessibilityChildren;
NSString *accessibilityIdentifier; NSString *accessibilityIdentifier;
UIAccessibilityNavigationStyle accessibilityNavigationStyle;
NSArray *accessibilityHeaderElements;
CGPoint accessibilityActivationPoint;
UIBezierPath *accessibilityPath;
ASPendingStateFlags _flags; ASPendingStateFlags _flags;
} }
@ -226,6 +234,10 @@ static UIColor *defaultTintColor = nil;
accessibilityViewIsModal = NO; accessibilityViewIsModal = NO;
shouldGroupAccessibilityChildren = NO; shouldGroupAccessibilityChildren = NO;
accessibilityIdentifier = nil; accessibilityIdentifier = nil;
accessibilityNavigationStyle = UIAccessibilityNavigationStyleAutomatic;
accessibilityHeaderElements = nil;
accessibilityActivationPoint = CGPointZero;
accessibilityPath = nil;
edgeAntialiasingMask = (kCALayerLeftEdge | kCALayerRightEdge | kCALayerTopEdge | kCALayerBottomEdge); edgeAntialiasingMask = (kCALayerLeftEdge | kCALayerRightEdge | kCALayerTopEdge | kCALayerBottomEdge);
return self; return self;
@ -594,6 +606,59 @@ static UIColor *defaultTintColor = nil;
} }
} }
- (UIAccessibilityNavigationStyle)accessibilityNavigationStyle
{
return accessibilityNavigationStyle;
}
- (void)setAccessibilityNavigationStyle:(UIAccessibilityNavigationStyle)newAccessibilityNavigationStyle
{
_flags.setAccessibilityNavigationStyle = YES;
accessibilityNavigationStyle = newAccessibilityNavigationStyle;
}
- (NSArray *)accessibilityHeaderElements
{
return accessibilityHeaderElements;
}
- (void)setAccessibilityHeaderElements:(NSArray *)newAccessibilityHeaderElements
{
_flags.setAccessibilityHeaderElements = YES;
if (accessibilityHeaderElements != newAccessibilityHeaderElements) {
accessibilityHeaderElements = [newAccessibilityHeaderElements copy];
}
}
- (CGPoint)accessibilityActivationPoint
{
if (_flags.setAccessibilityActivationPoint) {
return accessibilityActivationPoint;
}
// Default == Mid-point of the accessibilityFrame
return CGPointMake(CGRectGetMidX(accessibilityFrame), CGRectGetMidY(accessibilityFrame));
}
- (void)setAccessibilityActivationPoint:(CGPoint)newAccessibilityActivationPoint
{
_flags.setAccessibilityActivationPoint = YES;
accessibilityActivationPoint = newAccessibilityActivationPoint;
}
- (UIBezierPath *)accessibilityPath
{
return accessibilityPath;
}
- (void)setAccessibilityPath:(UIBezierPath *)newAccessibilityPath
{
_flags.setAccessibilityPath = YES;
if (accessibilityPath != newAccessibilityPath) {
accessibilityPath = newAccessibilityPath;
}
}
- (void)applyToLayer:(CALayer *)layer - (void)applyToLayer:(CALayer *)layer
{ {
ASPendingStateFlags flags = _flags; ASPendingStateFlags flags = _flags;
@ -827,6 +892,20 @@ static UIColor *defaultTintColor = nil;
if (flags.setAccessibilityIdentifier) if (flags.setAccessibilityIdentifier)
view.accessibilityIdentifier = accessibilityIdentifier; view.accessibilityIdentifier = accessibilityIdentifier;
if (flags.setAccessibilityNavigationStyle)
view.accessibilityNavigationStyle = accessibilityNavigationStyle;
#if TARGET_OS_TV
if (flags.setAccessibilityHeaderElements)
view.accessibilityHeaderElements = accessibilityHeaderElements;
#endif
if (flags.setAccessibilityActivationPoint)
view.accessibilityActivationPoint = accessibilityActivationPoint;
if (flags.setAccessibilityPath)
view.accessibilityPath = accessibilityPath;
// For classes like ASTableNode, ASCollectionNode, ASScrollNode and similar - make sure UIView gets setFrame: // For classes like ASTableNode, ASCollectionNode, ASScrollNode and similar - make sure UIView gets setFrame:
if (flags.setFrame && setFrameDirectly) { if (flags.setFrame && setFrameDirectly) {
@ -926,6 +1005,12 @@ static UIColor *defaultTintColor = nil;
pendingState.accessibilityViewIsModal = view.accessibilityViewIsModal; pendingState.accessibilityViewIsModal = view.accessibilityViewIsModal;
pendingState.shouldGroupAccessibilityChildren = view.shouldGroupAccessibilityChildren; pendingState.shouldGroupAccessibilityChildren = view.shouldGroupAccessibilityChildren;
pendingState.accessibilityIdentifier = view.accessibilityIdentifier; pendingState.accessibilityIdentifier = view.accessibilityIdentifier;
pendingState.accessibilityNavigationStyle = view.accessibilityNavigationStyle;
#if TARGET_OS_TV
pendingState.accessibilityHeaderElements = view.accessibilityHeaderElements;
#endif
pendingState.accessibilityActivationPoint = view.accessibilityActivationPoint;
pendingState.accessibilityPath = view.accessibilityPath;
return pendingState; return pendingState;
} }
@ -992,7 +1077,11 @@ static UIColor *defaultTintColor = nil;
|| flags.setAccessibilityElementsHidden || flags.setAccessibilityElementsHidden
|| flags.setAccessibilityViewIsModal || flags.setAccessibilityViewIsModal
|| flags.setShouldGroupAccessibilityChildren || flags.setShouldGroupAccessibilityChildren
|| flags.setAccessibilityIdentifier); || flags.setAccessibilityIdentifier
|| flags.setAccessibilityNavigationStyle
|| flags.setAccessibilityHeaderElements
|| flags.setAccessibilityActivationPoint
|| flags.setAccessibilityPath);
} }
- (void)dealloc - (void)dealloc

View File

@ -415,6 +415,10 @@ for (ASDisplayNode *n in @[ nodes ]) {\
XCTAssertEqual(YES, node.accessibilityElementsHidden, @"accessibilityElementsHidden broken %@", hasLoadedView); XCTAssertEqual(YES, node.accessibilityElementsHidden, @"accessibilityElementsHidden broken %@", hasLoadedView);
XCTAssertEqual(YES, node.accessibilityViewIsModal, @"accessibilityViewIsModal broken %@", hasLoadedView); XCTAssertEqual(YES, node.accessibilityViewIsModal, @"accessibilityViewIsModal broken %@", hasLoadedView);
XCTAssertEqual(YES, node.shouldGroupAccessibilityChildren, @"shouldGroupAccessibilityChildren broken %@", hasLoadedView); XCTAssertEqual(YES, node.shouldGroupAccessibilityChildren, @"shouldGroupAccessibilityChildren broken %@", hasLoadedView);
XCTAssertEqual(UIAccessibilityNavigationStyleSeparate, node.accessibilityNavigationStyle, @"accessibilityNavigationStyle broken %@", hasLoadedView);
XCTAssertTrue(CGPointEqualToPoint(CGPointMake(1.0, 1.0), node.accessibilityActivationPoint), @"accessibilityActivationPoint broken %@", hasLoadedView);
XCTAssertNotNil(node.accessibilityPath, @"accessibilityPath broken %@", hasLoadedView);
if (!isLayerBacked) { if (!isLayerBacked) {
XCTAssertEqual(UIViewAutoresizingFlexibleLeftMargin, node.autoresizingMask, @"autoresizingMask %@", hasLoadedView); XCTAssertEqual(UIViewAutoresizingFlexibleLeftMargin, node.autoresizingMask, @"autoresizingMask %@", hasLoadedView);
@ -468,6 +472,9 @@ for (ASDisplayNode *n in @[ nodes ]) {\
node.accessibilityElementsHidden = YES; node.accessibilityElementsHidden = YES;
node.accessibilityViewIsModal = YES; node.accessibilityViewIsModal = YES;
node.shouldGroupAccessibilityChildren = YES; node.shouldGroupAccessibilityChildren = YES;
node.accessibilityNavigationStyle = UIAccessibilityNavigationStyleSeparate;
node.accessibilityActivationPoint = CGPointMake(1.0, 1.0);
node.accessibilityPath = [UIBezierPath bezierPath];
if (!isLayerBacked) { if (!isLayerBacked) {
node.exclusiveTouch = YES; node.exclusiveTouch = YES;