我正在尝试将单个字符显示在与带字距的单个字符串一起显示的确切位置。问题在于,字符的边界框似乎是不透明的,因此每个新添加的字符都覆盖了某些先前的字符。在字距调整较大的地方(例如,在“ ToT”组合中),问题很明显:
我的设置是这样的:我在容器视图中嵌入了一个SKView。在SKView的视图控制器的扩展中,在函数中按以下顺序设置了以下内容:
skView.allowsTransparency = true
scene.backgroundColor = .clear
charAttr – [NSAttributedStringKey.backgroundColor: UIColor.clear]
textView.isOpaque = false
textView.backgroundColor = UIColor.clear
每个UITextView都作为子视图连续添加到该视图(这是一个SKView)。
我一直在代码中寻找一些线索,以寻找使角色边界框变得不透明的原因,但是我什么也没发现。可悲的是,我去年某个时候解决了这个问题,但不记得自己做了什么,也没有代码了。
任何见解或想法都会受到赞赏。
答案 0 :(得分:0)
在操场上达到抢手的效果后,我将此简单代码粘贴到了原始代码所在的扩展名中。它仍然有效,因此我使它与原始版本尽可能接近,直到它也出现了问题。
SKView和扩展方面无关。问题在于UITextView框架属性如何处理字符宽度。以下是相关代码:
// 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
似乎会使文本视图的背景变得不透明!这可能是由于在序列末尾分配给换行符char的宽度过大造成的。为了消除这个问题,我将不得不以另一种方式处理换行符。无论如何,我不知道为什么为什么会导致文本视图的背景变得不透明,但是确实如此。将宽度设置为任意值(例如30)可以消除问题。
以下是分别使用自动生成的宽度和手动设置的宽度的结果:
半透明的红色区域(在黄色背景上)显示每个字符(包括换行符)的边界矩形。