NSTextView和CATextLayer中不同且不一致的行高

时间:2016-12-29 18:25:42

标签: swift xcode cocoa

我正在创建一个类似画布的界面,可以在其中创建和编辑文本框对象。所有绘图都是通过CALayers处理的,但是当正在主动编辑文本框时,我使用不可见的NSTextViews进行事件处理。为了准确捕获事件,我需要在NSTextView和CATextLayer中以相同的方式布置文本行(特别是对于多行文本框)。

问题是NSTextView和CATextLayer似乎略有不同地呈现文本,给它们不同的行高。这因字体而异;有时NSTextView会更短,有时更长。下面的黑色文本位于NSTextView中,而蓝色是CATextLayer。随着线的累积,Helvetica Neue略微错位,而Helvetica从一开始就完全错位。

enter image description here

我不知道差异来自哪里,特别是因为效果是如此不可预测。有没有办法解释行高差异,或者,是否有更好的方法将从NSTextView捕获的事件转发到CATextLayer /从CATextLayer转发?

Swift playground代码(macOS 10.12.1,Xcode 7.1.1;虽然问题至少从10.11开始存在):

// Tested fonts:
// Andale Mono - slight misalignment
// Courier - extreme misalignment
// Courier New - small misalignment
// Helvetica - large misalignment
// Helvetica Neue - no (?) misalignment

import Cocoa

// setup
var str = "Text\nText\nText\nText\nText\nText\nText\nText\nText"
var theFont = CTFontCreateWithName("Helvetica Neue", 20, nil)
var parentView:NSView = NSView(frame: NSRect(origin: CGPointZero, size: CGSize(width: 300, height: 300)))

// create basic NSTextView
var textView:NSTextView = NSTextView(frame: NSRect(origin: CGPointZero, size: CGSize(width: 100, height: 300)))
textView.string = str
textView.font = theFont
parentView.addSubview(textView)

// create what SHOULD be an equivalent CATextLayer
var layerView:NSView = NSView(frame: NSRect(origin: CGPoint(x: 100, y: 0), size: CGSize(width: 100, height: 300)))
layerView.wantsLayer = true
var textLayer = CATextLayer()
textLayer.contentsScale = 2
textLayer.backgroundColor = NSColor(calibratedHue: 0, saturation: 0, brightness: 1, alpha: 1).CGColor
textLayer.foregroundColor = NSColor(calibratedHue: 0.6, saturation: 1, brightness: 1, alpha: 1).CGColor
textLayer.string = str
textLayer.font = CTFontCopyFullName(theFont)
textLayer.fontSize = CTFontGetSize(theFont)
layerView.layer = textLayer
parentView.addSubview(layerView)

// final display
parentView

0 个答案:

没有答案