SizeToFit () не работает должным образом с \ n? - PullRequest
0 голосов
/ 09 декабря 2018

Я создаю ярлык программно.У него всегда будет две строки.Однако размер шрифта этих двух строк изменится.Поэтому высоту и ширину этикетки придется менять.Я пытаюсь сделать это с помощью sizeToFit.Однако второе слово («день») отображается только частично.Нижняя часть слова обрезана.Как будто sizeToFit не распознает, что текст на самом деле состоит из двух строк.Это как если бы sizeToFit корректировал размер метки так, чтобы он занимал одну строку.Как мне это решить?Спасибо.

let screenWidth = UIScreen.main.bounds.width
let screenWidthHalf = screenWidth/2.0
let screenHeight = UIScreen.main.bounds.height
myLabel = UILabel()
myLabel.text = "Good \n Day"
myLabel.textAlignment = .center
let myLabelFontSize = 12.0*screenHeight/667
let myLabelFont = UIFont.systemFont(ofSize: myLabelFontSize)
myLabel.font = myLabelFont
myLabel.numberOfLines = 0
myLabel.sizeToFit()
let myLabelWidth = myLabel.frame.width
let myLabelWidthHalf = myLabelWidth/2.0
let myLabelX = screenWidthHalf - myLabelWidthHalf
let myLabelY = 142.5
myLabel.frame.origin.x = myLabelX
myLabel.frame.origin.y = myLabelY
scrollView.addSubview(myLabel)

1 Ответ

0 голосов
/ 09 декабря 2018

Мне нравится использовать метод, представленный каналом Lets Build That App (ознакомьтесь с динамическим содержимым ячеек новостной ленты Facebook), вместо sizeToFit.Я использую прокрутки.Это типичный метод, который я использую, чтобы получить высоту.Определенно принимает во внимание размер шрифта, новые строки и почти все, что я смог дать.

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

extension UILabel {
  func getEstimatedHeight(width: CGFloat) -> CGFloat {
    let size = CGSize(width: width, height: 1000)
    let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
    let estimatedFrame = NSString(string: self.text ?? "").boundingRect(with: size, options: options, attributes: [NSAttributedStringKey.font: self.font], context: nil)
    return estimatedFrame.height
  }
}

Возможно, вам также придется добавить коэффициент «выдумки» к вашему росту после того, как он будет возвращен.

 let myViewEstimatedHeight = toView.getEstimatedHeight(width: width - 100)
 myView.view.frame = CGRect(x: 20, y: 20, width: width, 
       height: myViewEstimatedHeight + 3)
...