突出显示已编辑的NSBrowserCell&在NSText上画一个聚焦环?

时间:2012-03-11 06:18:14

标签: objective-c macos cocoa user-interface appkit

我正在尝试做什么

我正在尝试为Connection Kit的NSBrowser添加编辑就地功能。我希望这种行为在功能和视觉上与Finder的实现类似。

我瞄准的视觉效果

Finder's implementation

到目前为止我已经得到了什么

NSBrowserCell subclass

箭头表示聚焦环&在Finder的实现中突出显示单元格,以及在我的实现中缺少它。

我试过

  • 在控制器中设置单元格的背景颜色,使用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];
}

2 个答案:

答案 0 :(得分:3)

你必须亲自画出聚焦环。 在NSBrowserCell子类

中的drawWithFrame中添加以下内容
[NSGraphicsContext saveGraphicsState];
[[controlView superview] lockFocus];

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

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

答案 1 :(得分:-1)

尝试子类化字段编辑器对象并覆盖drawRect函数,如下所示:

- (void)drawRect:(NSRect)rect {

    [super drawRect:rect];

    NSSetFocusRingStyle(NSFocusRingOnly);

    NSRectFill([self bounds]);

}

希望这有帮助。