NSTabView с цветом фона - PullRequest
3 голосов
/ 11 ноября 2011

Как обсуждалось в другом месте, NSTabView не имеет метода setBackgroundColor, и подклассы NSTabView и использование drawRect для управления им больше не работают - так как он не рисует верхние 10%, бит чуть ниже сегментированной кнопки управления.

Теперь я немного удивлен количеством обходных путей, которые мне пришлось сделать, чтобы решить эту проблему;см.

и мне интересно, пошел ли я по неверному пути.И как это сделать лучше и проще:

  • Кажется, NSSegmentStyleTexturedSquare дает мне полупрозрачный сегментированный элемент управления.Что означает, что мне нужно проделать дополнительную работу, чтобы скрыть какие-либо линии рамки (строка 240, 253).

    • Есть ли лучший способ сделать это?Т.е. отрицать его прозрачность?

    • или есть ли способ, которым я могу использовать фактическую / оригинальную сегментированную кнопку выбора?

  • Я считаю, что нужные мне цвета - например, [NSColor windowBackgroundColour] - не установлены на что-либо полезное (то есть прозрачное) - поэтому сейчас я жестко их кодирую (строки 87, 94).

    • Есть ли лучший способ сделать это?
  • Я считаю, что мне нужно множество пушистых методов, чтобы синхронизировать вещи (строка 128, 134 и т. Д.)

    • можно ли этого избежать?
  • Я считаю, что имитация ловкости при масштабировании означает, что мне нужно поддерживать постояннымпосмотрите на сегментированный блок управления и удалите / измените его размер.И даже тогда - это не так хорошо, как оригинал

    • Есть ли лучший способ сделать это, чем строка 157 - то есть услышать об изменении размера?Вместо того, чтобы делать это все время?
  • SegementControl затухает, когда фокус убирается из окна - в отличие от настоящего Маккоя.

    • это можно легко предотвратить?Есть ли дешевый способ отследить это?
  • Или это неправильный подход - и я должен сосредоточиться только на прозрачной дыре здесь - и позволить NSTabViewItem нарисовать фон?Но в любом случае - тогда у меня все еще есть проблема с блоком Segemented COntrol - или есть какой-то способ сделать это снова по умолчанию.

    • при попытке это - я застреваю сверху20-30 пикселей рисуется в «реальном» цвете фона окон, который является «прозрачным», и, следовательно, цвет не будет проходить до самого верха или позади линейки сегментов и до лицевой панели - но вместо этого остановится около 8пикселей ниже нижней части сегмента управления.

Обратная связь приветствуется - так как это кажется настолько далеким / неоптимальным для таких простых вещей - Большое спасибо.Брауни указывает на взлом / разветвление кода GitHub :) :) :) Как строка исполняемого кода говорит более тысячи слов.

Dw.

Ответы [ 3 ]

1 голос
/ 09 января 2012

PSMTabBarControl, вероятно, лучший обходной путь для вас.Я создал несколько пользовательских вкладок, но какао не очень хорошо с этим элементом управления.PSMTabBarControl был обновлен для поддержки Xcode 4. https://github.com/ciaran/psmtabbarcontrol

0 голосов
/ 03 октября 2015

Если ваша ситуация допускает некоторую хрупкость, очень простой и быстрый подход заключается в создании подкласса NSTabView и ручной настройке рамки подпредставлений элемента. Это дает каждому предмету бесшовный желтый фон:

- (void)drawRect:(NSRect)dirtyRect {
    static const NSRect offsetRect = (NSRect) { -2, -16, 4, 18 };

    NSRect rect = self.contentRect;

    rect.origin.x += offsetRect.origin.x;
    rect.origin.y += offsetRect.origin.y;
    rect.size.width += offsetRect.size.width;
    rect.size.height += offsetRect.size.height;

    [[NSColor yellowColor] set];
    NSRectFill(rect);

    [super drawRect:dirtyRect];
}

Будущее изменение показателей NSTabView, очевидно, будет проблемой, поэтому действуйте на свой страх и риск!

0 голосов
/ 02 июня 2015

Вы пытались установить цвет фона соответствующего CALayer? (Сделайте это слоистым представлением, если это еще не сделано, установив wantLayer = YES.)

...