gpt4 book ai didi

ios - 如何在具有无限行的 UILabel 上自动换行?

转载 作者:行者123 更新时间:2023-11-30 11:19:33 25 4
gpt4 key购买 nike

我有一个 UILabel,其中行数需要设置为 0(无限行)。但是,当它显示一个长单词时,它会按字符断行,形成第二行。我尝试手动设置换行模式

cell.nameLbl.adjustsFontSizeToFitWidth = true
cell.nameLbl.lineBreakMode = .byWordWrapping

但该应用程序仍然因字符而中断。我怎样才能解决这个问题?编辑-我希望缩小单词字体大小。

最佳答案

不幸的是,调整字体大小是按标签而不是按行完成的。包裹不会影响它。所以你看到的结果是预期的。您可以手动将字符串拆分为多个标签,或者将它们放入堆栈 View 中以获得所需的结果。

我尝试的是:

private func layoutText(text: String, onStackView stackView: UIStackView) {
var words: [String] = text.components(separatedBy: .whitespaces)

var currentLineWords: [String] = [String]()
var currentLabel: UILabel!

func newLabel() -> UILabel {
let label = UILabel(frame: stackView.bounds)
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.5
return label
}

while words.count > 0 {
if currentLineWords.count == 0 {
currentLabel = newLabel()
currentLineWords.append(words.removeFirst())
} else {
let newText = currentLineWords.joined(separator: " ") + " " + words[0]
currentLabel.text = newText
currentLabel.sizeToFit()

if currentLabel.bounds.width > stackView.bounds.width {
// Break line
currentLabel.text = currentLineWords.joined(separator: " ")
stackView.addArrangedSubview(currentLabel)
currentLabel = nil
currentLineWords = [String]()
} else {
// All good
currentLineWords.append(words.removeFirst())
}
}
}

if currentLineWords.count > 0 {
currentLabel.text = currentLineWords.joined(separator: " ")
stackView.addArrangedSubview(currentLabel)
}
}

这工作得相当巧妙,但是:

  • 当单词太长而无法放入一行时,即使缩小,也会在末尾显示“...”
  • 收缩后的线仍然具有相同的高度,而不是减小
  • 我们仅处理空格并插入退格

前两个问题可能都可以通过手动调整FontSizeToFitWidth来解决。基本上不断减小字体大小,直到适合或达到一定大小。如果遇到“特定大小”场景,则只需在标签上使用多行(将按字符中断)。

最后一个只是需要一些额外的努力。

出于多种原因,我仍然不会实现这个,其中之一是它看起来很丑,但仍然很有趣。

自定义字体大小调整:

要进行自定义字体调整和所有逻辑,仅在创建新留置权时进行更改:

            if currentLineWords.count == 0 {
currentLabel = newLabel()
currentLineWords.append(words.removeFirst())

currentLabel.text = currentLineWords.joined(separator: " ")
currentLabel.sizeToFit()

if currentLabel.bounds.width > stackView.bounds.width {
currentLabel.adjustsFontSizeToFitWidth = false

let originalFontSize: CGFloat = currentLabel.font.pointSize
var currentFontSize: CGFloat = originalFontSize
let minimalFontSize: CGFloat = currentLabel.minimumScaleFactor > 0.0 ? currentLabel.font.pointSize * currentLabel.minimumScaleFactor : originalFontSize

while currentLabel.bounds.width > stackView.bounds.width {
currentFontSize -= 1.0
if currentFontSize < minimalFontSize {
currentLabel.numberOfLines = 0
currentLabel.font = UIFont(name: currentLabel.font.fontName, size: originalFontSize)
break // Could not shrink it even further. USe multiline
}
currentLabel.font = UIFont(name: currentLabel.font.fontName, size: currentFontSize)
currentLabel.sizeToFit()
}

// Break line
stackView.addArrangedSubview(currentLabel)
currentLabel = nil
currentLineWords = [String]()
}
}

现在看起来可以使用。我的结果:

enter image description here

关于ios - 如何在具有无限行的 UILabel 上自动换行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51436084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com