【问题标题】:Strange changes to NSLayoutManager in 10.11 and higher10.11 及更高版本中对 NSLayoutManager 的奇怪更改
【发布时间】: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


【解决方案1】:

虽然非等效方法替换的惊喜仍然存在,但我还是找到了解决方案。

原来我不需要rectArrayForCharacterRange 方法来完成这项工作。我刚刚覆盖了 func fillBackgroundRectArray(_ rectArray: UnsafePointer<NSRect>, count rectCount: Int, forCharacterRange charRange: NSRange, color: NSColor) 并将我的 rect 计算放在那里。

现在一切都像魅力一样!

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2016-03-28
    • 1970-01-01
    • 2015-05-10
    • 2011-11-14
    相关资源
    最近更新 更多