排除功能无法使用NSTextView / UITextView正确移动文本

问题描述 投票:0回答:1

我有一个带有一些排除字符的NSTextView,因此我可以垂直移动文本,而不必诉诸于字符串中。但是,我注意到排除矩形是相当有限的,甚至可能是越野车,因为我不能垂直移动文本超过文本视图高度的〜45%。我找到了一种解决方法,可以将textview的高度增加2倍,但这感觉很粗糙,我宁愿“适当地”执行此操作]

enter image description here

在上图中,我有三个文本视图(从左到右)

  1. 以编程方式,而不是将其封装在NSScrollView中,高度为2x)>
  2. 以编程方式使用NSScrollView封装。 2x高度
  3. 使用界面生成器,常规高度。
  4. [排除矩形是用CAShapeLayer绘制的,您可以看到“ hello world new world”未正确放置在排除矩形之外。

我尝试了所有三个示例,以确保当封装在NSScrollView中时,关于IB默认设置或文本视图的动态,我不会丢失任何东西(AppKit和TextKit并不熟悉),但是所有3个示例都展示了相同的错误。

更新文本排除矩形的代码

((每次滑块在右下角移动,它将更新其文本矩形)

label.stringValue = "excl: \(sender.integerValue): height: \(view.frame.height)"
print(sender.integerValue)

let exclHeight: CGFloat = CGFloat(slider.integerValue)


[aTextView, bTextView, cTextView]
  .compactMap { $0 }
  .forEach {
    let rect = CGRect(
      x: 5,
      y: 5,
      width: aTextView.frame.width - 10,
      height: exclHeight)
    $0.wantsLayer = true
    $0.textContainer?.exclusionPaths.removeAll()
    $0.textContainer?.exclusionPaths.append(.init(rect: rect))
    $0.layer?.sublayers?.forEach {
      $0.removeFromSuperlayer()
    }

    let layer = CAShapeLayer()
    layer.frame = rect
    layer.backgroundColor = NSColor.blue.withAlphaComponent(0.2).cgColor
    layer.borderWidth = 1
    layer.borderColor = NSColor.white.cgColor
    $0.layer?.addSublayer(layer)
  }
}
    

我有一个带有一些排除矩形的NSTextView,所以我可以垂直移动文本,而不必诉诸于字符串中。但是,我注意到排除矩形是......>

ios cocoa uitextview nstextview textkit
1个回答
0
投票

问题似乎是exclusionPath在第一行之前。

仅在参数周围玩耍,两行示例文本在第一行之后的rect y位置正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.