Solution A: Create a subclass NSWindowand override makeFirstResponder:. makeFirstRespondercalled when the first responder changes.
- (BOOL)makeFirstResponder:(NSResponder *)responder {
BOOL madeFirstResponder = [super makeFirstResponder:responder];
if (madeFirstResponder) {
id view = [self firstResponder];
if (view && [view isKindOfClass:[NSTextView class]] && [view isFieldEditor])
view = [view delegate];
if (view && [view isKindOfClass:[NSControl class]] && [view enclosingScrollView]) {
NSRect rect = [view bounds];
rect = NSInsetRect(rect, -10.0, -10.0);
[view scrollRectToVisible:rect];
}
}
return madeFirstResponder;
}
Solution B: Subclass NSTextFieldand 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);
[self scrollRectToVisible:rect];
}
}
return becameFirstResponder;
}
source
share