Как реализовать пользовательское кольцо фокусировки в drawRect для NSTextField или NSTextVew - PullRequest
4 голосов
/ 05 октября 2011

Я хочу нарисовать настраиваемое кольцо фокусировки для моего подкласса NSTextView (который по умолчанию не имеет кольца фокусировки). Мне удалось реализовать это, переопределив родительский NSScrollView drawRect и добавив этот код:

- (void)drawRect:(NSRect)dirtyRect {
    if (focused) {
        NSSetFocusRingStyle(NSFocusRingOnly);
        NSRectFill(dirtyRect);
    }

    [super drawRect:dirtyRect];
}

Однако я хочу нарисовать свое собственное кольцо фокусировки. Я искал и искал примеры этого, и пытался возиться и писать сам, но безрезультатно. Самая большая проблема у меня заключается в том, что она обрезается до кадра NSScrollView / NSTextView, независимо от того, как я это делаю.

Спасибо.

1 Ответ

0 голосов
/ 11 сентября 2012

В каркасе Carbon есть HIThemeBeginFocus() и HIThemeEndFocus(), которые позволяют автоматически создавать «сфокусированный» вид любой серии рисунков (например, прямоугольника или фигуры). Требуется Mac OS X 10.5 или более поздняя версия.

При этом используется Core Graphics напрямую. Чтобы найти контекст CG из метода drawRect: в Какао, вы должны сделать что-то вроде:

NSGraphicsContext* contextMgr = [NSGraphicsContext currentContext];
CGContextRef drawingContext = (CGContextRef)[contextMgr graphicsPort];

Чтобы избежать отсечения, одним из вариантов является использование родительского представления (например, NSBox без рамки) для дополнительного заполнения. Выполните пользовательский рисунок в месте вставки в родительском представлении, которое не будет обрезано; другими словами, создайте иллюзию, что представление немного меньше, чем фактический прямоугольник.

...