【问题标题】:NSTextView changing Insertion Point (Caret) Cursor size when there is no stringNSTextView在没有字符串时更改插入点(插入符号)光标大小
【发布时间】:2015-12-01 20:59:30
【问题描述】:

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

插入符光标(I-Beam / IBeam 光标)的大小似乎基于NSTextViewattributedString 属性上的当前字体大小属性。

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

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

查看这些屏幕截图: 注意这里右边的textview有一个小的插入点光标:

我开始打字,它的大小更新了:

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

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

  [_textEditor setTypingAttributes:typingAttributes];
  [_textEditor setDelegate:self];

  [view addSubview:_textEditor];
  [self updateInsertionPointColor];

  [[view window] makeFirstResponder:_textEditor];
  [view setNeedsDisplay:YES];

【问题讨论】:

    标签: cocoa nstextview appkit


    【解决方案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: "")
    

    【讨论】:

      【解决方案2】:

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

      NSFont *font = [NSFont fontWithName:@"Marker Felt" size:24.0];
      NSDictionary *attr = @{
                               NSFontAttributeName: font
                             };
      [self.textView setTypingAttributes:attr];
      

      我得到了我期望的大 I 型光标。

      这与 TextEdit 所做的基本相同(示例代码 here),因此就设置 typingAttributes 而言,看起来您没有做错任何事情。

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

      【讨论】:

      • 感谢您的回复,感谢您制作了一个测试应用程序(我应该自己做以确认)。我用显示操作顺序的相关代码编辑了我的问题
      【解决方案3】:

      在没有文本时更改属性,使用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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-21
        • 2011-04-23
        • 1970-01-01
        相关资源
        最近更新 更多