Ios 换行符在UILabel中不起作用
下面是Ios 换行符在UILabel中不起作用,ios,xcode,uilabel,Ios,Xcode,Uilabel,下面是UILabel的结果。只有单词太长时才会发生 下面是我想要达到的目标。如果我降低标签的高度,它就会起作用。但标签高度是动态的 帮助欣赏。 谢谢无论何时,只要您将标签高度设置为动态 选择属性检查器中的行计数为0 然后根据标签的内容自动增加高度。我发现,当单词大于另一行时,所有lineBreakMode模式都会在另一行上传递字符。 看来解决这个问题的唯一办法就是改变字体大小以适应这个词。Autoshrink有一些限制,不能检测到将单词拆分为几行,所以您需要手动检测单词是否不合适,并相应地更
UILabel
的结果。只有单词太长时才会发生
下面是我想要达到的目标。如果我降低标签的高度,它就会起作用。但标签高度是动态的
帮助欣赏。
谢谢无论何时,只要您将标签高度设置为动态 选择属性检查器中的行计数为0
然后根据标签的内容自动增加高度。我发现,当单词大于另一行时,所有lineBreakMode模式都会在另一行上传递字符。 看来解决这个问题的唯一办法就是改变字体大小以适应这个词。Autoshrink有一些限制,不能检测到将单词拆分为几行,所以您需要手动检测单词是否不合适,并相应地更改字体大小
有相同问题的问题:您可以将约束设置为对标签的要求。假设不需要固定高度,则无需设置底部约束 请参见下图,我已为动态标签高度设置了约束。希望这对你有帮助
试试这个。它应该将字体缩小到刚好适合一行中最长的单词。如果你看到更好的方法,请让我知道,因为我很想改进这一点。我相信我可以将其适应IB的工作
import UIKit
extension UILabel{
func adjustedFont()->UIFont {
let attributes: [NSAttributedStringKey: Any] = [.font: font]
let attributedString = NSAttributedString(string: text ?? "", attributes: attributes)
let drawingContext = NSStringDrawingContext()
drawingContext.minimumScaleFactor = minimumScaleFactor
attributedString.boundingRect(with: bounds.integral.size,
options: .usesLineFragmentOrigin,
context: drawingContext)
let fontSize = font.pointSize * drawingContext.actualScaleFactor
return font.withSize(fontSize)
}
func fitMaxWord(){
layoutIfNeeded()
let scaledFont = self.adjustedFont()
let currentFont = scaledFont
if let txt = text,
let maxString = txt.components(separatedBy: " ").max(by: {$1.count > $0.count})?.replacingOccurrences(of: "\n", with: ""){
let maxFontSize: CGFloat = currentFont.pointSize
let minFontSize: CGFloat = 5.0
var q = maxFontSize
var p = minFontSize
let height = currentFont.lineHeight
let constraintSize = CGSize(width: .greatestFiniteMagnitude, height: height)
var sizedFont = currentFont
while(p <= q){
let currentSize = (p + q) / CGFloat(2)
sizedFont = currentFont.withSize( CGFloat(currentSize) )
let text = NSMutableAttributedString(string:maxString, attributes:[NSAttributedStringKey.font:sizedFont])
let textRect = text.boundingRect(with: constraintSize, options: [.usesLineFragmentOrigin], context: nil).integral
let labelSize = textRect.width
//1 is a fudge factor
if labelSize == ceil(self.bounds.width - 1){
break
}else if labelSize > ceil(self.bounds.width - 1){
q = currentSize - 0.1
}else{
p = currentSize + 0.1
}
}
if sizedFont.pointSize < currentFont.pointSize{
self.font = sizedFont
}
}
}
}
这在大多数情况下都应该有效。我测试了你的文字和更多的文字。您可以在上面的示例中看到这两种情况。如果您的字符串具有固定值,则这是问题的解决方案,如您在问题中所示(即
朱拉隆功大学
)
在界面生成器中为标签设置以下属性
CHULALONGKORN UNIVERSITY
这样的单行)。在两个单词之间的空格处按alt+enter最小字体比例”,并将比例值设置为0.5`或您想要设置的任何最小比例
正如
Romit
所述,清楚地写下标签高度是动态的
。你应该尝试自动布局,检查我尝试的这个链接,但它不起作用,我必须保持居中对齐。yourLabelName.textAlignment=NSTextAlignmentCenter;但iphone对设备大小有限制。Iphone最大宽度为414,所以只需减小字体大小。我会检查。谢谢你这将适用于你目前的情况,但我可以想出一个改进,使之适用于任何情况。我的网络连接很糟糕,所以大约需要一个小时左右so@RomitM现在试一试。您可以通过调用self.view.layoutIfNeeded()来测试IB示例,然后标签上的扩展名与上面的相同。我让它可以处理更多的文本,并获得当前的字体大小,如果启用了缩放功能,则字体大小可能是动态的。如果您找到更好的方式在这里进行评论,请答应。当然我会这样做。这是一个修复字/字符串CHULALONGKORN UNIVERSITY
,您希望将其设置为两行。或者该字符串可能会更改?不,这是一个动态字符串。但我在朱拉隆功大学找到了这个问题
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//we could test longer text
//
let text = "CHULALONGKORN UNIVERSITY Plus a lot of additional text to make sure it still does not clip a word"
let testLabel = UILabel(frame: .zero)
//testLabel.text = "CHULALONGKORN UNIVERSITY"
testLabel.text = text
testLabel.numberOfLines = 0
testLabel.textAlignment = .center
testLabel.font = UIFont.systemFont(ofSize: 45)
testLabel.adjustsFontSizeToFitWidth = true //unneeded in this instance but lets set it
testLabel.minimumScaleFactor = 0.3
self.view.addSubview(testLabel)
testLabel.translatesAutoresizingMaskIntoConstraints = false
testLabel.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 20).isActive = true
testLabel.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -20).isActive = true
testLabel.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 50).isActive = true
self.view.layoutIfNeeded()
testLabel.fitMaxWord()
}
}