2011-11-11 4 views
2

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

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

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

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

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

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

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

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

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

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

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

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

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

Dw.

ответ

1

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

0

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

+0

Хмм - пробовал (см.выше ссылку GitHub, https://github.com/dirkx/CustomizableTabView/commit/bfbd5aeecaf13c65611d221a31cb644ed48108d4#diff-7d6a9b4a9a691023219e9dc3082910e6) - настройки для plain.XXX. И никакого печенья. –

+0

Что было drawsBackground set to? Был ли тип вида табуляции NSNoTabsNoBorder? Вы уверены, что NIB был даже загружен временем, когда была вызвана applicationDidFinishLaunching? – dgatwood

+0

Конечно (и перемещение кода в setColour не меняет поведения). Проблема по-прежнему заключается в том, что фон «ускользает» от содержимого содержимого табуляции. –

0

Если ваша ситуация может выдержать некоторую хрупкость, очень простой и быстрый подход заключается в подклассе 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, очевидно, быть проблемой, так действовать на свой страх и риск!

Смежные вопросы