我正在尝试做什么
我正在尝试为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];
}
答案 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]);
}
希望这有帮助。