Skip to content

Instantly share code, notes, and snippets.

@pronebird
Created July 21, 2016 01:01
Show Gist options
  • Save pronebird/d1baa914f50f001d4ab00e34286b2e80 to your computer and use it in GitHub Desktop.
Save pronebird/d1baa914f50f001d4ab00e34286b2e80 to your computer and use it in GitHub Desktop.
Workaround to prevent VO from accessing elements in presenting view displayed beneath dimmed overlay. Default container view ignores `-accessibilityViewIsModal`
/**
* Workaround to prevent VO from accessing elements in presenting view beneath overlay.
*
* @param transitionView UIPresentationController.containerView
*/
static void MLPatchTransitionViewAccessibility(id transitionView) {
NSCParameterAssert(transitionView);
static Class transitionViewClass;
static Class mlTransitionViewClass;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SEL accessibilityViewIsModalSelector = @selector(accessibilityViewIsModal);
transitionViewClass = NSClassFromString([@[ @"UI", @"Transition", @"View" ] componentsJoinedByString:@""]);
// Add subclass of UITransitionView
Method originalMethod = class_getInstanceMethod(transitionViewClass, accessibilityViewIsModalSelector);
if(!originalMethod) {
MLCLog(@"MLPatchTransitionViewAccessibility", MLLogLevelWarning, @"Cannot get %@.%@", NSStringFromClass(transitionViewClass), NSStringFromSelector(accessibilityViewIsModalSelector));
return;
}
const char *methodEncoding = method_getTypeEncoding(originalMethod);
// implement -accessibilityViewIsModal that always returns YES.
IMP impl = imp_implementationWithBlock(^BOOL {
return YES;
});
mlTransitionViewClass = objc_allocateClassPair(transitionViewClass, "MLTransitionView", 0);
if(mlTransitionViewClass) {
class_addMethod(mlTransitionViewClass, accessibilityViewIsModalSelector, impl, methodEncoding);
objc_registerClassPair(mlTransitionViewClass);
MLCLog(@"MLPatchTransitionViewAccessibility", MLLogLevelVerbose, @"Register class pair %@: %@", NSStringFromClass(mlTransitionViewClass), NSStringFromClass(transitionViewClass));
}
});
if([transitionView isKindOfClass:transitionViewClass]) {
object_setClass(transitionView, mlTransitionViewClass);
} else {
MLCLog(@"MLPatchTransitionViewAccessibility", MLLogLevelWarning, @"Expected an instance of %@. Got %@", NSStringFromClass(transitionViewClass), NSStringFromClass([transitionViewClass class]));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment