在NSString的一部分周围绘制框

时间:2014-11-06 18:09:34

标签: objective-c macos cocoa swift nstextview

我需要用边框装饰包含当前选择的段落。这是一个模型,插入点位于第二段中的某个位置:

Mockup

现在我收到包含当前选择点的段落的CGRect,在我的NSTextView子类中,我正在覆盖drawRect并执行

var path = NSBezierPath(roundedRect: currentParagraphRect, xRadius: 4, yRadius: 4)
path.stroke()

这确实在段落周围画了一个方框,但它没有删除它,所以随着文档的进展我留下了一堆乱糟糟的行。

我不确定这是否是正确的覆盖点,因为我觉得drawRect应该只被调用几次,而不是每次选择点都会改变,这种情况会发生很多。

我走错了路吗?我是否应该覆盖不同的绘图机制?

或者我应该要求布局管理器为每个段落创建一个NSTextView,然后在整个视图周围绘制一个框?

1 个答案:

答案 0 :(得分:1)

  

我不确定这是否是正确的覆盖点,因为我感觉drawRect应该只被调用几次,而不是每次选择点都会改变,这种情况会发生很多。

drawRect:一直被调用,这是一个非常非常受欢迎的功能。这就是您将rect作为参数发送的原因,因此您不必在每次调用时重绘整个视图。

如果你想继续试图覆盖-drawRect:,你需要先画一遍整个矩形,然后再每次都这样做

self.backgroundColor.setFill()
NSBezierPath.fillRect(dirtyRect)
// draw your oval around the current paragraph 
// call super

然后,每次选定的段落发生变化时,您都需要确保调用setNeedsDisplay: