一尘不染

颜色属性在带有NSLinkAttributeName的NSAttributedString中被忽略

swift

在中NSAttributedString,字母范围具有链接属性和自定义颜色属性。

这是测试代码。

Swift 2,Xcode 7:

import Cocoa
import XCPlayground

let text = "Hey @user!"

let attr = NSMutableAttributedString(string: text)
let range = NSRange(location: 4, length: 5)
attr.addAttribute(NSForegroundColorAttributeName, value: NSColor.orangeColor(), range: range)
attr.addAttribute(NSLinkAttributeName, value: "http://somesite.com/", range: range)

let tf = NSTextField(frame: NSRect(x: 0, y: 0, width: 200, height: 50))
tf.allowsEditingTextAttributes = true
tf.selectable = true
tf.stringValue = text
tf.attributedStringValue = attr

XCPlaygroundPage.currentPage.liveView = tf

Swift 3,Xcode 8:

import Cocoa
import PlaygroundSupport

let text = "Hey @user!"

let attr = NSMutableAttributedString(string: text)
let range = NSRange(location: 4, length: 5)
attr.addAttribute(NSForegroundColorAttributeName, value: NSColor.orange, range: range)
attr.addAttribute(NSLinkAttributeName, value: "http://somesite.com/", range: range)

let tf = NSTextField(frame: NSRect(x: 0, y: 0, width: 200, height: 50))
tf.allowsEditingTextAttributes = true
tf.isSelectable = true
tf.stringValue = text
tf.attributedStringValue = attr

PlaygroundPage.current.liveView = tf

我已经向Apple发送了一个错误报告,但是与此同时,如果有人对Xcode 8中的修复程序或变通办法有所了解,那将是很好的。


阅读 800

收藏
2020-07-07

共1个答案

一尘不染

苹果开发人员回答:

请注意,我们的工程团队已根据所提供的信息确定此问题的 行为符合预期

他们解释了为什么它以前有用,但现在不再有用:

不幸的是, 以前的行为 (使用自定义颜色呈现NSLinkAttributeName的归因字符串范围) 不受显式支持
。它之所以起作用,是因为NSTextField仅在存在字段编辑器时才渲染链接。如果没有字段编辑器,我们将退回到NSForegroundColorAttributeName指定的颜色。

版本10.12更新了NSLayoutManager和NSTextField以使用默认链接外观呈现链接,类似于iOS。(请参阅有关10.12的AppKit发行说明。

为了提高一致性,预期的行为是使用默认链接外观绘制表示链接(通过NSLinkAttributeName指定)的范围。因此,当前行为是预期行为。

(强调我的)

2020-07-07