我创建了一个NSTextField
子类,用它的内容长度调整宽度。 (覆盖intrinsicContentSize
)的想法来自this question。
override var intrinsicContentSize: NSSize {
if isEditing {
if let fieldEditor =
self.window?.fieldEditor(false, for: self) as?
NSTextView
{
let rect = fieldEditor.layoutManager!.usedRect(
for: fieldEditor.textContainer!
)
let size = rect.size
return size
}
}
let size = self.cell!.cellSize
return size
}
但是,在最后一个字符后面还有一个空白区域。如果我手动设置size.width
(例如size.width -= 3.5
),则文本将在编辑期间来回(水平)偏移。
在重命名侧边栏项时,我在macOS的Finder中看不到这个怪癖。如何在不使文本“跳跃”的情况下摆脱额外的空间?
我添加了a demo on GitHub。
尝试将NSTextView
的textContainerInset设置为0,0的大小,这无法解决问题。
使用@МихаилМасл®的回答更新了the repo。在编辑过程中,文本仍然摇摇欲坠。可以通过签出初始提交来查看原始实现。
答案 0 :(得分:1)
你可以直接用已定义的字体计算字符串的大小试试这个(我在TableTextField.swift
使用了你的代码):
class TableTextField: NSTextField {
...
override var intrinsicContentSize: NSSize {
return stringValue.size(withConstraintedHeight: 1000, font: fieldEditor.font!)
}
...
}
extension String {
func size(withConstraintedHeight height: CGFloat, font: NSFont) -> CGSize {
let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height)
let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin,
attributes: [NSAttributedStringKey.font: font], context: nil)
let size = boundingBox.size
return CGSize(width: size.width + 0.5, height: size.height)
}
}
我不倾向于使它安全,所以可能你可以做得更好并排除强制解包和跟随错误