Search code examples
cocoaaccessibilitynsscrollview

Accessibility: ScrollView to auto scroll to the view which are not visible on hitting "TAB"


Could someone let me know how can I automatically scroll the scrollView when a keyboard-only user tries to navigate between different UI Element in the ScrollView using ‘Tab’ key? When I hit "TAB" key the focus is shifted to different UI element present in the scrollView but it doesn't scroll if the UI Element is not present in the Visible Content View. How can this be achieved. Help would be appreciated. Thanks.


Solution

  • Solution A: Create a subclass of NSWindow and override makeFirstResponder:. makeFirstResponder is called when the first responder changes.

    - (BOOL)makeFirstResponder:(NSResponder *)responder {
        BOOL madeFirstResponder = [super makeFirstResponder:responder];
        if (madeFirstResponder) {
            id view = [self firstResponder];
            // check if the new first responder is a field editor
            if (view && [view isKindOfClass:[NSTextView class]] && [view isFieldEditor])
                view = [view delegate]; // the control, usually a NSTextField
            if (view && [view isKindOfClass:[NSControl class]] && [view enclosingScrollView]) {
                NSRect rect = [view bounds];
                rect = NSInsetRect(rect, -10.0, -10.0); // add a margin
                [view scrollRectToVisible:rect];
            }
        }
        return madeFirstResponder;
    }
    

    Solution B: Create a subclass of NSTextField and other controls and override becomeFirstResponder.

    - (BOOL)becomeFirstResponder {
        BOOL becameFirstResponder = [super becomeFirstResponder];
        if (becameFirstResponder) {
            if ([self enclosingScrollView]) {
                NSRect rect = [self bounds];
                rect = NSInsetRect(rect, -10.0, -10.0); // add a margin
                [self scrollRectToVisible:rect];
            }
        }
        return becameFirstResponder;
    }