2012-03-11 1 views
4

То, что я пытаюсь сделатьПодсветка отредактированного NSBrowserCell и рисование фокусного кольца на его NSText?

Я пытаюсь добавить функциональность редактирования на месте NSBrowser комплект подключения в. Я бы хотел, чтобы это поведение было функционально и визуально похоже на реализацию Finder.

Визуальный эффект я стремлюсь к

Finder's implementation

То, что я получил до сих пор

NSBrowserCell subclass

Стрелки указывают кольцо фокусировки & ячейка подсветки в Реализация Искателя и отсутствие его в моей.

Я попытался

  • Настройка цвета фона ячейки в контроллере, в это drawInteriorWithFrame метод
  • То же самое для редактора поля
  • setFocusRingType:NSFocusRingTypeDefault для редактора поля & клетки как в контроллере & метод ничьей
  • Вручную рисовать цвет выделения в методе рисования
  • Различные сочетания вышеизложенного, и, несомненно, некоторые из них я забыл.

Лучшее, что мне удалось, это получить область, окружающую изображение ячейки, окрашенную цветом подсветки.

Есть ли какие-то фундаментальные положения, которые мне здесь не хватает? Может ли кто-нибудь предложить начальную точку для этого? Есть drawInteriorWithFrame место для этого?

У меня есть работа по редактированию - у меня просто проблемы с визуальными аспектами.

код разрешить редактирование:

// In the main controller 
int selectedColumn = [browser selectedColumn]; 
int selectedRow = [browser selectedRowInColumn:selectedColumn]; 
NSMatrix *theMatrix = [browser matrixInColumn:selectedColumn]; 
NSRect cellFrame = [theMatrix cellFrameAtRow:selectedRow column:0]; 

NSText *fieldEditor = [[browser window] fieldEditor:YES 
              forObject:editingCell]; 

[cell editWithFrame:cellFrame 
      inView:theMatrix 
      editor:fieldEditor 
      delegate:self 
       event:nil]; 

И в моем подклассу NSBrowserCell:

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { 

    image = [[self representedObject] iconWithSize:[self imageSize]]; 

    [self setImage:image]; 

    NSRect imageFrame, highlightRect, textFrame; 

    // Divide the cell into 2 parts, the image part (on the left) and the text part. 
    NSDivideRect(cellFrame, &imageFrame, &textFrame, ICON_INSET_HORIZ + ICON_TEXT_SPACING + [self imageSize].width, NSMinXEdge); 
    imageFrame.origin.x += ICON_INSET_HORIZ; 
    imageFrame.size = [self imageSize]; 

    [super drawInteriorWithFrame:cellFrame inView:controlView]; 
} 

- (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject event:(NSEvent *)theEvent { 
    NSRect imageRect, textRect; 
    NSDivideRect(aRect , &imageRect, &textRect, 20, NSMinXEdge); 
    self.editing = YES; 
    [super editWithFrame: textRect inView: controlView editor:textObj delegate:anObject event:theEvent]; 
} 

ответ

3

Вы должны сделать кольцо фокусировки самостоятельно. Добавьте следующее в drawWithFrame в вашем NSBrowserCell подклассе

[NSGraphicsContext saveGraphicsState]; 
[[controlView superview] lockFocus]; 

NSSetFocusRingStyle(NSFocusRingAbove); 
[[NSBezierPath bezierPathWithRect:NSInsetRect(frame,-1,-1)] fill]; 

[[controlView superview] unlockFocus]; 
[NSGraphicsContext restoreGraphicsState]; 
+0

Спасибо @mpergand своим кодом Я думаю, что смогу выполнить свою цель. –

-1

Try подклассов поле объект редактора и переопределить DrawRect функции следующим образом:

- (void)drawRect:(NSRect)rect { 

    [super drawRect:rect]; 

    NSSetFocusRingStyle(NSFocusRingOnly); 

    NSRectFill([self bounds]); 

} 

Надеется, что это помогает.

+0

Это не сработало. –