Быстрое отображение ошибки NSAttributedString с неразрывными пробелами и несколькими строками - PullRequest
0 голосов
/ 17 мая 2018

Прошу прощения, если это очевидно, но я искал некоторое время, и это меня озадачивает.

У меня есть NSAttributedString, которая содержит:

1) "Заполнениеthe-blank "-esque подстрока состоит из неразрывных пробелов со стилем подчеркивания, примененным к этой подстроке (например," \ u {00a0} \ u {00a0} \ u {00a0} "со стилем подчеркивания, примененным только к этой подстроке;Первоначально я использовал подчеркивания, но пробел между ними был проблематичным, так как мой текст имеет непрозрачность, поэтому вы можете видеть пробел или перекрытие)

2) несколько разрывов строк в конце строки с возможностью заполнения.в пустом поле (например, "... \ na) первый выбор \ nb) второй выбор \ nc) последний выбор")

Затем я отображаю эту строку NSAttributedString в метке, для которой numberOfLines установлено в 0.

Это прекрасно работает в 90% случаев, за исключением 10% случаев, когда неразрывная «заливка в пустую» появляется на расстоянии переноса от конца строки, что означает, что она перемещаетсяк пстрока ext (как и ожидалось), которая выталкивает весь остальной текст вперёд, и если в абзаце происходит достаточное нажатие, она полностью выталкивает окончательную строку выбора (например, «\ nc) последний выбор») из метки, так чтоне отображается последняя строка строки !?Другими словами, мой ярлык SEEMS рассчитывает, насколько большим он должен быть до применения неразрывных пробелов, поэтому, если затем создаются неразрывные пробелы / подстроки, последняя строка обрезается и не отображается ввсе.

Есть ли какой-то другой способ создать или приписать эту неразрывную «заливку в пустую», чтобы она не переносилась по символам (то есть сохраняла все в одной строке), номой ярлык поймет / пересчитает, что дополнительные строки были созданы с помощью указанного отсутствия переноса?Как я уже упоминал, на моем ярлыке уже установлено значение numberOfLines, равное 0;возможно, есть какой-то стиль абзаца или другая настройка метки, которую я не смог найти?Или это просто ошибка Swift, но кто-то знает обходной путь?

Ниже приведены некоторые фрагменты из моего кода:

let underlineString = "\u{00a0}\u{00a0}\u{00a0}\u{00a0}\u{00a0}"
let myTextAttributes = [NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue): UIFont(name: "My Font", size: round(self.view.frame.width / 15)) as Any, NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue): UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 0.9)]

let myLabel = UILabel()
myLabel.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
myLabel.textAlignment = .center
myLabel.numberOfLines = 0

var myText = "What do you think about \u{00a0}\u{00a0}\u{00a0}\u{00a0}\u{00a0} and then what about this extra stuff at the end?\na) first choice\nb) second choice\nc) last choice"
var myAttributedText = NSMutableAttributedString(string:myText, attributes: myTextAttributes)
myAttributedText.addAttribute(NSAttributedStringKey.underlineStyle, value: NSUnderlineStyle.styleThick.rawValue, range: (myText as NSString).range(of:underlineString))
myLabel.attributedText = myAttributedText
self.view.addSubview(myLabel)

myLabel.translatesAutoresizingMaskIntoConstraints = false
myLabel.heightAnchor.constraint(equalToConstant: self.view.frame.height).isActive = true
myLabel.widthAnchor.constraint(equalToConstant: self.view.frame.width).isActive = true
myLabel.centerXAnchor.constraint(equalTo: myLabel.superview!.centerXAnchor).isActive = true
myLabel.centerYAnchor.constraint(equalTo: myLabel.superview!.centerYAnchor).isActive = true

Большое вам спасибо за ваше время!

1 Ответ

0 голосов
/ 18 мая 2018

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

С учетом сказанного я смог обойти эту конкретную ошибку, переключившись обратно на обычные символы для моей подстроки "fill-in-the-blank", установив foregroundColor для этих символов для очистки, а затем установив underlineColor к белому, чтобы он не принял цвет переднего плана.

...