如何在drawRect中为NSTextField或NSTextVew实现自定义聚焦环

时间:2011-10-05 04:14:36

标签: objective-c cocoa nstextfield drawrect nstextview

我想为我的NSTextView子类绘制一个自定义焦点环(默认情况下没有焦点环)。我设法通过覆盖父NSScrollView drawRect并添加此代码来实现它:

- (void)drawRect:(NSRect)dirtyRect {
    if (focused) {
        NSSetFocusRingStyle(NSFocusRingOnly);
        NSRectFill(dirtyRect);
    }

    [super drawRect:dirtyRect];
}

但是,我想绘制自己的自定义对焦环。我搜索并搜索了这个例子,并试着乱搞并自己写,但无济于事。我遇到的最大问题是它会被裁剪到NSScrollView / NSTextView框架,无论我怎么做。

感谢。

1 个答案:

答案 0 :(得分:0)

在Carbon框架中有HIThemeBeginFocus()HIThemeEndFocus(),它们允许您使任何系列的绘图(例如矩形或形状)具有自动“聚焦”外观。需要Mac OS X 10.5或更高版本。

这直接使用Core Graphics。要从Cocoa中的drawRect:方法中查找CG上下文,您可以执行以下操作:

NSGraphicsContext* contextMgr = [NSGraphicsContext currentContext];
CGContextRef drawingContext = (CGContextRef)[contextMgr graphicsPort];

就避免剪裁而言,一种选择是使用父视图(例如没有边框的NSBox)来提供额外的填充。在父视图中不会被剪裁的插入位置执行自定义绘图;换句话说,假设视图比实际矩形小一点。