Почему фоны в этих UITextViews не ясны?
Я пытаюсь отобразить отдельные символы в точных позициях, которые бы они отображали, если бы отображались как одна строка с кернингом. Проблема в том, что ограничивающие рамки символов кажутся непрозрачными, так что каждый вновь добавленный символ покрывает часть предыдущего. Где кернинг больше (например, в комбинации "ToT"), проблема очевидна:
Моя установка примерно такая: у меня есть SKView, встроенный в представление контейнера. В расширении контроллера представления SKView в функции устанавливаются следующие параметры:
skView.allowsTransparency = true
scene.backgroundColor = .clear
charAttr – [NSAttributedStringKey.backgroundColor: UIColor.clear]
textView.isOpaque = false
textView.backgroundColor = UIColor.clear
Каждый UITextView добавляется последовательно как подпредставление к представлению (которое является SKView).
Я просмотрел весь код, чтобы понять, что делает ограничивающие рамки персонажа кажущимися непрозрачными, но я ничего не нашел. Грустно то, что я решил эту проблему где-то в прошлом году, но не помню, что я сделал, и у меня больше нет кода.
Любые идеи или идеи будут оценены.
1 ответ
После достижения желаемого эффекта на игровой площадке я вставил этот простой код в расширение, где находился исходный код. Это все еще работало, поэтому я сделал его максимально похожим на оригинал, пока он не продемонстрировал проблему.
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
кажется, делает фон текстового представления непрозрачным! Это может быть вызвано необычно большой шириной, назначенной символу перевода строки в конце последовательности. Чтобы устранить эту проблему, мне придется работать с символами перевода строки по-другому. В любом случае, я понятия не имею, почему это приводит к тому, что фон текстового представления становится непрозрачным, но это так. Установка ширины в произвольное значение, скажем, 30, устраняет проблему.
Вот результаты использования автоматически сгенерированных и вручную установленных значений ширины соответственно:
Полупрозрачные красные области (на желтом фоне) показывают ограничивающие прямоугольники для каждого из символов, включая символ новой строки.