NSTextField处于编辑模式时的额外空白

时间:2017-10-28 14:40:44

标签: swift macos cocoa nstextfield nstextview

我创建了一个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中看不到这个怪癖。如何在不使文本“跳跃”的情况下摆脱额外的空间?

extra space after text

更新1:

我添加了a demo on GitHub

更新2:

尝试将NSTextViewtextContainerInset设置为0,0的大小,这无法解决问题。

更新3:

使用@МихаилМасл®的回答更新了the repo。在编辑过程中,文本仍然摇摇欲坠。可以通过签出初始提交来查看原始实现。

1 个答案:

答案 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)
  }
}

我不倾向于使它安全,所以可能你可以做得更好并排除强制解包和跟随错误