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
  • 设置行数=2
  • 设置换行模式=截断尾部
  • 将Autoshrink设置为
    最小字体比例”,并将比例值设置为
    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()
        }
    
    
    }