辅助功能:ScrollView自动滚动到视图,在点击"TAB"时看不到

Rah*_*ngh 6 cocoa accessibility nsscrollview

当有键盘用户尝试使用"Tab"键在ScrollView中的不同UI元素之间导航时,有人能让我知道如何自动滚动scrollView吗?当我点击"TAB"键时,焦点将转移到scrollView中存在的不同UI元素,但如果UI元素不在可见内容视图中,则它不会滚动.如何实现这一目标.帮助将不胜感激.谢谢.

Wil*_*eke 6

解决方案A:创建NSWindow和覆盖的子类makeFirstResponder:.makeFirstResponder在第一个响应者更改时调用.

- (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;
}
Run Code Online (Sandbox Code Playgroud)

解决方案B:创建NSTextField其他控件和覆盖的子类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;
}
Run Code Online (Sandbox Code Playgroud)