NSOutlineView с редактором прозрачных полей - PullRequest
4 голосов
/ 27 марта 2011

Я работаю с NSOutlineView, расположенным на панели HUD. Я настроил его так, чтобы он не рисовал свой фон. Все выглядит хорошо, пока я дважды не нажму, чтобы изменить ячейку. Полевой редактор рисует фон и кольцо фокусировки, которое полностью разрушает весь пользовательский опыт.

Это то, что я делаю в подклассе NSTextFieldCell:

- (NSText *)setUpFieldEditorAttributes:(NSText *)textObj
{   
    NSText *text = [super setUpFieldEditorAttributes:textObj];

    [text setDrawsBackground:YES];
    [text setBackgroundColor:[NSColor darkGrayColor]];

    return text;
}

Если я использую setDrawsBackground: НЕТ, он полностью игнорируется, и я получаю белый фон. Мое решение далеко от того, чтобы быть хорошим, потому что я не могу коснуться альфа-компонента цвета (если я это сделаю, снова редактор полей будет использовать другой цвет в качестве фона), но по крайней мере я не получаю белый фон.

Мне интересно, есть ли реальное решение этой проблемы. Должен ли я предоставить свой собственный редактор полей? Стоит ли это того?

Мне нужен просто редактор полей без фона и без кольца фокуса, просто мигает курсор.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 10 июня 2011

Проблема в том, что NSTableView рисует белый фон при отправке -editColumn: row: withEvent: select :.Он заполняет прямоугольник ячейки с помощью + [NSColor textBackgroundColor].

Если есть открытый API для переопределения текущего параметра для именованных цветов из цветового пространства разработчика, мы могли бы установить его внутри переопределения -editColumn: row: withEvent: выберите: или тому подобное.Я не помню такого API (указатели приветствуются). ТАКЖЕ: я тестировал этот код только на Snow Leopard (даже в приложении Leopard SDK ниже).Проверьте код по фактическим SDK и средам выполнения, которые вы намереваетесь поддерживать.

У NSTableView есть частный метод доступа, который он использует для цвета заливки, но это свойство только для чтения.Нет установщика, поэтому мы не можем просто изменить значение в стандартном NSTableView.Мы должны сделать это подклассом.(Поскольку вы хотите такое же поведение в outlineView, а NSOutlineView уже является подклассом NSTableView, мы собираемся создать подкласс NSOutlineView. Но, кроме суперкласса, код идентичен.)

@interface ASCOutlineView : NSOutlineView {

}

@end

@implementation ASCOutlineView

- _textBackgroundColor
{
    return  ([NSColor clearColor]);
}

@end

кажетсяЭто все, что нужно, чтобы этот яркий белый блок не разрушил ваш HUD при редактировании ячеек таблицы в Snow Leopard.

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

NSTextFieldCells фактически являются обертками для NSTextViews, поэтому их можно использовать внутри элементов управления.Обычно они используют один и тот же экземпляр textView, которым управляет окно (или его подкласс, панель, в данном случае).NSTableView изменяет настройки NSTextFieldCell в соответствии с настройками пользовательского интерфейса системы для редактирования данных.В основном.Затем NSTextFieldCell распространяет эти параметры в NSTextView.В любой точке этого конвейера мы можем переопределить один или два метода, чтобы изменить значения этих свойств, чтобы они соответствовали нашему собственному пользовательскому интерфейсу.

Я использую - [NSTextFieldCell setDrawsBackground:], поскольку для его исправления требуется мало усилий.Также важно, чтобы внутреннее состояние соответствовало эффекту, который мы надеемся достичь в случае, если какой-то другой объект может зависеть от этого состояния.

@interface ASCTextFieldCell : NSTextFieldCell {

}

@end

@implementation ASCTextFieldCell

- (void)setDrawsBackground: (BOOL)flag
{
    [super setDrawsBackground: NO];
}

@end

И предотвращение появления кольца фокусировки, пока ячейкабыть отредактированным - это просто изменить настройку типа кольца фокуса.К сожалению, IB не предоставляет доступ к этому свойству, поэтому это должно быть сделано программно:

for(eachColumn in [hudOutlineView tableColumns])
{
    columnCell = [[ASCTextFieldCell alloc] initTextCell: @""];
    [eachColumn setDataCell: columnCell];

    if([columnCell respondsToSelector: @selector(setFocusRingType:)] != NO)
        [(NSTextFieldCell *)columnCell setFocusRingType: NSFocusRingTypeNone];
}
0 голосов
/ 09 июня 2011

Похоже, за полевым редактором есть другой фон, который отображается белым цветом. Вероятно, NSCell или фон строки, что угодно еще.

...