Можем ли мы ограничить ширину NSMutableAttributedString?

#ios #swift #uilabel #nsmutableattributedstring

#iOS #swift #uilabel #nsmutableattributedstring

Вопрос:

У меня есть строка, например: Арья вчера сказала «Мы должны найти решение». Здесь я хочу ограничить ширину текста, выделенного жирным шрифтом («Мы должны найти решение»), до 100, но другие не должны сокращаться. Итак, я добавил его как 3 разных NSMutableAttributedString файла, добавленных вместе, и установил для этого значение UILabel . Я хочу знать, могу ли я ограничить ширину только одной из этих строк. Я попробовал следующее :

let mutableString = "We must find a solution"

  1. mutableString.draw(in: CGRect(x: 0, y: 0, width: 100, height: 30))

  2. mutableString.draw(with: CGRect(x: 0, y: 0, width: 10, height: 10), options: .truncatesLastVisibleLine, context: .none)

  3. 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 получение нескольких строк.