NSTextView在没有字符串时更改插入点(插入)光标大小

时间:2015-12-01 20:59:30

标签: cocoa nstextview appkit

我正在创建NSTextView,我想在NSTextView为空时更改插入点的大小。

看门狗光标(I-Beam / IBeam光标)大小基于attributedString的{​​{1}}属性的当前字体大小属性。

问题是因为NSTextView有一个空NSTextView,所以字符串上没有属性。这意味着我无法应用字体大小。

但是,我可以更改attributedString以使fontSize正确 - 但插入点光标在我开始输入之前不会更新大小

查看以下屏幕截图: 请注意,右侧的textview有一个小的插入点光标:
enter image description here

我开始输入,并且大小更新:
enter image description here

所以我的问题是,当我初始化它时,是否需要在typingAttributes上设置一个属性,以便使初始插入点光标的大小正确? (我希望它匹配NSTextView字体)

编辑: @Mark Bessey提出了一个很好的问题 - 我设置输入属性的顺序是什么:

typingAttributes

3 个答案:

答案 0 :(得分:1)

我只是遇到了同样的问题,并且-在任何地方都找不到合适的解决方案后-设法通过插入字符然后在同一周期中用空字符串替换该字符来迫使NSTextView更新其指针。

我正在textView(_:shouldChangeTextIn:replacementString :)中执行此操作,但我想它在其他地方也能正常工作。

let attributedString = NSAttributedString(string: " ", attributes: attributes)
                    
let range = someRange
let insertLocation = range.location + range.length
textView.textStorage?.insert(attributedString, at: insertLocation)

textView.typingAttributes = attributes

textView.replaceCharacters(in: range, with: "")

答案 1 :(得分:0)

在我的applicationDidFinishLaunching方法中,在一个简单的测试应用程序中执行此操作:

match_phrase

我得到了我期望的大型工字形光标。

这与TextEdit的作用基本相同(示例代码here),因此就设置typingAttributes而言,它看起来并没有出错。

我想知道你是否在错误的时间设置属性。你什么时候设置typingAttributes?屏幕上的视图?它是第一响应者吗?

答案 2 :(得分:0)

要在没有文本时更改属性,请使用typingAttributes

打字的属性是自动复位,每当选择的变化。但是,如果添加任何更改文本属性的用户操作,则该操作应在以后使用此方法来应用这些属性。更改属性的用户操作应始终设置键入属性,因为在下次键入之前可能不会随后进行选择更改。

@IBOutlet var targetTextView: NSTextView!{
    didSet {
        let attributes:[NSAttributedString.Key:Any] = [
            .font:NSFont.userFont(ofSize: 16.0) ?? NSFont.systemFont(ofSize: 16.0),
            .foregroundColor:NSColor(named: "targetColor")!
        ]
        targetTextView.typingAttributes = attributes
    }
}