Пользовательский NSMenu-подобный вид не отображает selectedMenuItemColor правильно - PullRequest
4 голосов
/ 13 марта 2012

Я написал свой собственный класс, похожий на NSMenu, чтобы показывать результаты динамического поиска ниже NSSearchField в NSWindow без полей. Он работает хорошо, но не рисует магию selectedMenuItemColor правильно, если я добавляю отступы в верхнюю часть подпредставления. Я поместил 5-пиксельный отступ в верхней части окна контейнера, чтобы имитировать NSMenu, и когда я делаю это, синий выделенный градиент выглядит не так. Изображение и код должны прояснить это:

enter image description here

Вот мой код drawRect в моем представлении элементов (помните, что это просто обычный NSView):

-(void) drawRect:(NSRect)dirtyRect {
    CGRect b = self.bounds;
    if (selected) {

        [NSGraphicsContext saveGraphicsState];

        [[NSColor selectedMenuItemColor] set];
        NSRectFill( b );

        [NSGraphicsContext restoreGraphicsState];
        if (textField) {
            textField.textColor = [NSColor selectedMenuItemTextColor];
        }
    } else {
        [[NSColor clearColor] set];
       NSRectFillUsingOperation(b, NSCompositeSourceOver);
        if (textField) {
            textField.textColor = [NSColor blackColor];
        }
    }
}

1 Ответ

0 голосов
/ 24 октября 2012

Вы должны получить начало фазы шаблона, совпадающее с вашей рамкой вида.

То есть selectedMenuItemColor на самом деле является шаблоном, а не цветом, и этот шаблон предназначен для «правильного» отображения с шагом «стандартная высота элемента меню». Поскольку вы добавили отступ, теперь он не отображается в «стандартном» месте.

Попробуйте это:

-(void) drawRect:(NSRect)dirtyRect {
    CGRect b = self.bounds;
    if (selected) {

       NSPoint origin = [self frame].origin;
       curContext = [NSGraphicsContext currentContext];
       [curContext saveGraphicsState];
       [curContext setPatternPhase: origin];

        [[NSColor selectedMenuItemColor] set];
        NSRectFill( b );

        [curContext restoreGraphicsState];
        if (textField) {
            textField.textColor = [NSColor selectedMenuItemTextColor];
        }
    } else {
        [[NSColor clearColor] set];
       NSRectFillUsingOperation(b, NSCompositeSourceOver);
        if (textField) {
            textField.textColor = [NSColor blackColor];
        }
    }
}
...