【发布时间】:2017-06-30 08:44:10
【问题描述】:
我的目标是使文本选择行为类似于 Apple Pages、MS Word 和任何其他文本处理器,当 NSTextView 仅选择文本字形而不选择任何缩进或整个 NSTextContainer 大小时,就像默认 NSTextView 的行为一样。
考虑到这个目标,我继承了 NSLayoutManager 并覆盖了func rectArray(forCharacterRange charRange: NSRange, withinSelectedCharacterRange selCharRange: NSRange, in container: NSTextContainer, rectCount: UnsafeMutablePointer<Int>) -> NSRectArray?
在我的覆盖中,我只是计算了只绑定字形并拒绝任何缩进、空格等的新矩形。
一切正常。但突然在 macOS 10.11 中,Apple 确实弃用了我正在使用的方法。并建议改用func enumerateEnclosingRectsForGlyphRange: withinSelectedGlyphRange: inTextContainer: usingBlock:。
但似乎这种新方法不像以前不推荐使用的方法那样起作用。不可能再自定义封闭的矩形了。我所能做的就是通过 rects TextKit 的计算来枚举。现在不可能实现理想的文本选择行为,因为矩形是只读的。顺便说一下,TextKit 根本不会调用新方法。所以我没有必要考虑它。
我该怎么办?
【问题讨论】:
-
提交错误报告?
-
这不是错误。这是故意的。按设计。他们用新方法替换了旧方法。只是新的功能几乎不相似。
-
为什么不能覆盖
enumerateEnclosingRects(forGlyphRange:withinSelectedGlyphRange:in:using:)而不是rectArray(forGlyphRange:withinSelectedGlyphRange:in:rectCount:)?或者这在 Swift 中是不可能的? -
我已经解释过了。 enumerateEnclosureRects 永远不会被 AppKit 调用。它只是开发人员获取已生成矩形列表的辅助方法。因此,没有必要覆盖它。而 Apple 工程师的设计决定首先让我感到惊讶。
-
新方法不允许旧方法的全部功能这一事实很可能是一个错误;你只是假设它不是。 Cocoa API 非常复杂,确实会犯错误。如果您发现 API 有问题,您应该提交错误。
标签: macos cocoa osx-elcapitan appkit nslayoutmanager