Почему фоны в этих UITextView не ясны?

Я пытаюсь отобразить отдельные символы в точных позициях, в которых они будут отображаться в виде одной строки с кернингом. Проблема в том, что ограничивающие рамки символов кажутся непрозрачными, так что каждый новый добавленный символ закрывает часть предыдущего. Там, где кернинг больше (например, в комбинации «ToT»), проблема очевидна:

введите здесь описание изображения

Мои настройки примерно такие: у меня есть SKView, встроенный в представление контейнера. В расширении контроллера представления SKView следующие параметры устанавливаются внутри функции в следующем порядке:

skView.allowsTransparency = true
scene.backgroundColor = .clear

charAttr – [NSAttributedStringKey.backgroundColor: UIColor.clear]

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

Каждый UITextView добавляется последовательно как подпредставление к представлению (которое является SKView).

Я просмотрел весь свой код в поисках подсказки относительно того, что может сделать ограничивающие рамки персонажа непрозрачными, но я ничего не нашел. Печально то, что я решил эту проблему где-то в прошлом году, но не помню, что я делал, и у меня больше нет кода.

Любые идеи или идеи будут оценены.


person Optimalist    schedule 23.08.2018    source источник
comment
пожалуйста, поделитесь остальной код, если вы можете.   -  person ThE uSeFuL    schedule 23.08.2018
comment
Вы создали textView.attributedText как NSAttributedString. Пожалуйста, поделитесь остальной частью кода того, как вы устанавливаете textView   -  person Rhetorical    schedule 23.08.2018
comment
вы также должны изменить charAttr - [ на и оператор присваивания charAttr = [   -  person Rhetorical    schedule 23.08.2018
comment
@ThEuSeFuL, я только что создал вариант, который работает правильно, рядом с кодом, который не работает. Проблема, с которой я столкнулся раньше, заключалась в том, что из-за того, что было так много нерелевантного кода, я не хотел публиковать все. В любом случае либо выложу код оставшейся проблемы, либо выложу решение. Подожди....   -  person Optimalist    schedule 23.08.2018
comment
@Rhetorical, код и решение (если это можно так назвать) здесь. Я не публиковал код раньше, потому что не мог сказать, какая из многих вещей могла быть виновником. (Что касается строки charAttr, я просто пытался показать соответствующий атрибут, но я думаю, что знак равенства также сработал бы.)   -  person Optimalist    schedule 23.08.2018


Ответы (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 устраняет проблему.

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

введите здесь описание изображения введите здесь описание изображения

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

person Optimalist    schedule 23.08.2018