为什么这些 UITextView 中的背景不清晰?

Why aren't the backgrounds within these UITextViews clear?

我正在尝试将单个字符显示在它们显示为带有字距调整的单个字符串时它们会出现的确切位置。问题在于字符的边界框似乎是不透明的,因此每个新添加的字符都会覆盖一些先前添加的字符。字距较大的地方(例如组合 "ToT"),问题很明显:

我的设置是这样的:我在容器视图中嵌入了一个 SKView。在 SKView 的视图控制器的扩展中,以下内容按此顺序在函数中设置:

skView.allowsTransparency = true
scene.backgroundColor = .clear

charAttr – [NSAttributedStringKey.backgroundColor: UIColor.clear]

textView.isOpaque = false
textView.backgroundColor = UIColor.clear

每个 UITextView 作为子视图依次添加到视图(这是一个 SKView)。

我查看了我的所有代码以寻找一些线索,以了解是什么导致角色的边界框看起来不透明,但我没有找到任何线索。可悲的是我去年的某个时候解决了这个问题,但是不记得我做了什么并且没有代码了。

如有任何见解或想法,我们将不胜感激。

在playground中实现了抢手的效果后,我将这段简单的代码粘贴到原代码所在的扩展中。它仍然有效,所以我尽可能地把它和原来的一样,直到它也出现问题。

SKView 和扩展方面无关紧要。问题在于 UITextView frames 属性 如何处理字符宽度。相关代码如下:

// charInfoArray contains (among other things) an attributed character, its origin,
// its size, and info about whether or not it should be displayed

// For each char, the origin and size info were derived from...
let currentCharRect = layoutManager.boundingRect(forGlyphRange: currentCharRange, in: textContainer)

// To display each (attributed) char of "ToT\n" . . .
for (index, charInfo) in charInfoArray.enumerated() {

    guard charInfo.displayed == true else { continue }

    let textView = UITextView()
    textView.backgroundColor = UIColor.clear
    textView.attributedText = charInfo.attrChar
    textView.textContainerInset = UIEdgeInsets.zero

    // let width = charInfo.size!.width
    let width = 30 // arbitrary width

    // Using the automatically generated charInfo.size!.width here
    // appears to make the text view's background opaque!
    textView.frame = CGRect(origin: charInfo.origin!, 
        size: CGSize(width: width, height: charInfo.size!.height))

    textView.frame = textView.frame.offsetBy(dx: 0.0, dy: offsetToCenterY)
    textView.textContainer.lineFragmentPadding = CGFloat(0.0)
    textView.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.2)
    textView.textColor = UIColor.black
    view.addSubview(textView)

    print(charInfo.size!.width)
}

将宽度设置为 width = charInfo.size!.width 似乎会使文本视图的背景不透明!这可能是由于在序列末尾分配给换行符的宽度异常大所致。为了消除这个问题,我将不得不以另一种方式处理换行符。无论如何,我不知道为什么 这会导致文本视图的背景变得不透明,但确实如此。将宽度设置为任意值,例如 30 可以消除问题。

下面是分别使用自动生成和手动设置宽度的结果:

半透明的红色区域(在黄色背景上)显示每个字符的边界矩形,包括换行符。