UILabel SizetoFit после указания количества строк?

Я хотел бы создать UILabel программно после указания количества строк. Я использую Свифт. У меня есть следующий код:

let newLabel = UILabel()
newLabel.text = "Hello There"
newLabel.font = UIFont.systemFont(ofSize: 16)
newLabel.numberOfLines = 2
newLabel.lineBreakMode = .byWordWrapping
newLabel.sizeToFit()
newLabel.frame.origin.x = 100
newLabel.frame.origin.y = 500
view.addSubview(newLabel)

Проблема в том, что метка имеет текст на одной строке, а не на двух строках. Я должен использовать sizeToFit, потому что fontSize на самом деле динамический (он не всегда равен 16). Как я могу убедиться, что метка состоит из 2 строк? Спасибо.


person Everett    schedule 08.12.2018    source источник
comment
так ты всегда ожидаешь две строчки? или Вы хотите текст Hello\nТам   -  person Fahim Parkar    schedule 08.12.2018


Ответы (2)


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

newLabel.frame = CGRect(x: 100, y: 500, width: newLabel.frame.width - 1, height: newLabel.frame.height * 2)

Но это не очень хорошо, и я предлагаю использовать AutoLayout

person andesta.erfan    schedule 08.12.2018

Есть много вещей, которые вы можете сделать, чтобы разорвать линию. 1) Вы можете использовать "\n" между словами. Но не уверен насчет вашего варианта использования и имеет ли это смысл. 2) Хотя не рекомендуется, вы можете определить ширину метки. 3) Используйте numberOfLines = 0, если вы можете перейти на более чем 2 строки. Однако, если вам нужны только 2 строки, укажите numberOfLines = 2.

Также используйте ограничения, как показано ниже, а не кадр:

 private let newLabel: UILabel = {
     let label = UILabel()
     label.translatesAutoresizingMaskIntoConstraints = false
     label.text = "Hello There"
     label.font = UIFont.systemFont(ofSize: 16)
     label.numberOfLines = 0

     return label
   }()

   view.addSubview(newLabel)

   NSLayoutConstraint.activate([
      newLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 500),
      newLabel.leadingAnchor.constraint(equalTo:view.leadingAnchor, constant: 100),
      newLabel.widthAnchor.constraint(equalToConstant: 70)
   ]) 
person AbhishekS    schedule 08.12.2018