NSLayoutManager returns NSTextView 中 mousePosition 的 glyphIndex 不正确
NSLayoutManager returns incorrect glyphIndex for mousePosition in NSTextView
我有一个 NSTextView
子类作为 NSSplitViewController
中的右侧项目,左侧面板是 NSOutlineView
。为了在文本视图中按下命令键时处理鼠标单击,我添加了以下内容以查找鼠标下方的字形:
override func mouseDown(with event: NSEvent) {
guard
let lm = self.layoutManager,
let tc = self.textContainer
else { return }
let localMousePosition = convert(event.locationInWindow, to: nil)
var partial = CGFloat(1.0)
let glyphIndex = lm.glyphIndex(for: localMousePosition, in: tc, fractionOfDistanceThroughGlyph: &partial)
print(glyphIndex)
}
但是,这会导致索引大约 10 左右过高,从而选择了错误的字形。我的文本视图只有等宽字符,所以偏移不是由额外的字形引起的。
有趣的是,如果我折叠左侧面板(在代码中或故事板中),我会得到正确的索引。但是x方向的偏移量大于左边面板的宽度。
我在这里遗漏了什么,上面的代码有错误吗?
根据上面@Willeke 的评论,我对我的代码进行了以下更改:
localMousePosition = convert(event.locationInWindow, from: nil)
if enclosingScrollView?.frame.width == window?.frame.width {
// left panel is collapsed, so use convert: to:
localMousePosition = convert(event.locationInWindow, to: nil)
}
似乎有效。
问题是我也在 mouseMoved
中使用了 localMousePosition = convert(event.locationInWindow, to: nil)
(localMousePosition
是视图的 属性)。将其更改为 localMousePosition = convert(event.locationInWindow, from: nil)
使一切正常。再次感谢@Willeke 指出这一点。
我有一个 NSTextView
子类作为 NSSplitViewController
中的右侧项目,左侧面板是 NSOutlineView
。为了在文本视图中按下命令键时处理鼠标单击,我添加了以下内容以查找鼠标下方的字形:
override func mouseDown(with event: NSEvent) {
guard
let lm = self.layoutManager,
let tc = self.textContainer
else { return }
let localMousePosition = convert(event.locationInWindow, to: nil)
var partial = CGFloat(1.0)
let glyphIndex = lm.glyphIndex(for: localMousePosition, in: tc, fractionOfDistanceThroughGlyph: &partial)
print(glyphIndex)
}
但是,这会导致索引大约 10 左右过高,从而选择了错误的字形。我的文本视图只有等宽字符,所以偏移不是由额外的字形引起的。
有趣的是,如果我折叠左侧面板(在代码中或故事板中),我会得到正确的索引。但是x方向的偏移量大于左边面板的宽度。
我在这里遗漏了什么,上面的代码有错误吗?
根据上面@Willeke 的评论,我对我的代码进行了以下更改:
localMousePosition = convert(event.locationInWindow, from: nil)
if enclosingScrollView?.frame.width == window?.frame.width {
// left panel is collapsed, so use convert: to:
localMousePosition = convert(event.locationInWindow, to: nil)
}
似乎有效。
问题是我也在 mouseMoved
中使用了 localMousePosition = convert(event.locationInWindow, to: nil)
(localMousePosition
是视图的 属性)。将其更改为 localMousePosition = convert(event.locationInWindow, from: nil)
使一切正常。再次感谢@Willeke 指出这一点。