如何让NSTextView的高度一直高于实际高度20px?

How to make the height of NSTextView always higher than the actual height of 20px?

我正在使用NSTextView作为文本编辑器,我希望它比用户输入文本后重新计算的高度高约20PX。

也就是NSTextView在NSScrollView的末尾滚动的时候,有一个空白区域,使得用户不用再输入一个return来做一个空行。这样尾部的文字就会一直在上边,方便用户的视觉体验。

你是怎么做到的?

How to resize NSTextView according to its content?

我在这个问题中找到了一些提示,但是连接时间太长了。

由于您的 NSTextView 大多数时候嵌套在 NSScrolView 中,您可以调整滚动视图的边距。

下面的解决方案适用于基于故事板的应用程序,它的最低要求为 OS X 10.10 (Yosemite):

class ViewController: NSViewController {
    @IBOutlet weak var scrollView: NSScrollView!
    @IBOutlet weak var textView: NSTextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        textView.layoutManager?.delegate = self
        scrollView.automaticallyAdjustsContentInsets = false
    }
}

extension ViewController: NSLayoutManagerDelegate {
    func layoutManager(_ layoutManager: NSLayoutManager, didCompleteLayoutFor textContainer: NSTextContainer?, atEnd layoutFinishedFlag: Bool) {
        guard let textContainer = textContainer else { return }

        let textRect = layoutManager.usedRect(for: textContainer)
        let bottomSpace: CGFloat = 20.0
        let bottomInset: CGFloat = (textRect.height + bottomSpace) > scrollView.bounds.height ? bottomSpace : 0

        scrollView.contentInsets.bottom = bottomInset
        scrollView.scrollerInsets.bottom = -bottomInset
    }
}

编辑: 如果单击底部如何滚动文本视图space?

您可以尝试 NSParagraphStyle 在最后一段之后添加一些内容。或者您可以使用响应链并使视图控制器将光标位置更改为文本视图的末尾:

class ViewController: NSViewController {
    // ...

    override func mouseUp(with event: NSEvent) {
        let bottomSpace = scrollView.contentInsets.bottom
        let clickLocation = self.view.convert(event.locationInWindow, to: textView)
        let bottomRect = CGRect(x: 0, y: textView.bounds.height, width: textView.bounds.width, height: bottomSpace)

        if bottomRect.contains(clickLocation) {
            textView.moveToEndOfDocument(self)
        }
    }
}

如果您想要具有相同行为的多个文本视图,是时候设计您自己的 class。