#ios #swift #uilabel #nsmutableattributedstring
#iOS #swift #uilabel #nsmutableattributedstring
Вопрос:
У меня есть строка, например: Арья вчера сказала «Мы должны найти решение». Здесь я хочу ограничить ширину текста, выделенного жирным шрифтом («Мы должны найти решение»), до 100, но другие не должны сокращаться. Итак, я добавил его как 3 разных NSMutableAttributedString
файла, добавленных вместе, и установил для этого значение UILabel
. Я хочу знать, могу ли я ограничить ширину только одной из этих строк. Я попробовал следующее :
let mutableString = "We must find a solution"
-
mutableString.draw(in: CGRect(x: 0, y: 0, width: 100, height: 30))
-
mutableString.draw(with: CGRect(x: 0, y: 0, width: 10, height: 10), options: .truncatesLastVisibleLine, context: .none)
-
mutableString.boundingRect(with: CGSize(width: 100, height: 40), options: [.truncatesLastVisibleLine,.usesFontLeading], context: .none)
Но ни один из них не сработал. Я хочу воспроизвести UILabel
.lineBreakMode = .byTruncatingTail
для NSMutableAttributedString
. Я делаю что-то не так здесь, есть ли способ добиться этого?
Комментарии:
1. Что должно произойти, если выделенная жирным шрифтом строка длиннее 100? Вы хотите обрезать ее в конце? Можете ли вы добавить несколько изображений, показывающих конечный результат для разных длин строк, выделенных жирным шрифтом?
2. Я хочу, чтобы последняя часть была усечена следующим образом: это усечение….
3. «Но ни один из них не работал» — что именно не работает?
4. Я хотел, чтобы результирующая NSMutableAttributedString была такой: «Мы должны найти …. поэтому я попробовал методы 1,2,3, перечисленные выше, но возвращаемая строка всегда является не усеченной версией. Я хочу воспроизвести uilabel’s .lineBreakMode = .byTruncatingTail для NSMutableAttributedString
5. Как насчет использования трех
UILabel
строк рядом друг с другом? Теперь вы можете использовать.lineBreakMode
для выделения текста жирным шрифтом. Вы можете выровнять их по горизонталиUIStackView
, чтобы это выглядело как одна строка.
Ответ №1:
Вот решение, использующее три UILabel
s в UIStackView
:
override func viewDidLoad() {
super.viewDidLoad()
let label1 = UILabel()
label1.text = "Arya said"
label1.font = UIFont.italicSystemFont(ofSize: 20.0)
let label2 = UILabel()
label2.text = ""We must find a solution""
label2.font = UIFont.boldSystemFont(ofSize: 20.0)
label2.lineBreakMode = .byTruncatingTail
let label3 = UILabel()
label3.text = "yesterday"
label3.font = UIFont.italicSystemFont(ofSize: 20.0)
let stack = UIStackView(arrangedSubviews: [label1, label2, label3])
stack.axis = .horizontal
stack.spacing = 4
label2.translatesAutoresizingMaskIntoConstraints = false
stack.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
label2.widthAnchor.constraint(equalToConstant: 100)
])
self.view.addSubview(stack)
NSLayoutConstraint.activate([
stack.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
stack.centerYAnchor.constraint(equalTo: self.view.centerYAnchor)
])
}
вывод:
Комментарии:
1. В этом случае мы сможем разрешить несколько строк текста, если текст динамический?
2. Можете ли вы привести пример ввода и ожидаемого результата?
3. Вы можете настроить
label2.numberOfLines = 0
получение нескольких строк.