我想做什么
我正在尝试向Connection Kit的NSBrowser添加编辑就地功能.我希望这种行为在功能和视觉上与Finder的实现类似.
我瞄准的视觉效果
到目前为止我得到了什么
箭头表示聚焦环&在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];
}
最佳答案 你必须自己画出聚焦环.
在NSBrowserCell子类中的drawWithFrame中添加以下内容
[NSGraphicsContext saveGraphicsState];
[[controlView superview] lockFocus];
NSSetFocusRingStyle(NSFocusRingAbove);
[[NSBezierPath bezierPathWithRect:NSInsetRect(frame,-1,-1)] fill];
[[controlView superview] unlockFocus];
[NSGraphicsContext restoreGraphicsState];