Почему фоны в этих 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, устраняет проблему.

Вот результаты использования автоматически сгенерированных и вручную установленных значений ширины соответственно:

Полупрозрачные красные области (на желтом фоне) показывают ограничивающие прямоугольники для каждого из символов, включая символ новой строки.

Другие вопросы по тегам