由于字体大小更改,Swift标签未更新帧

由于字体大小更改,Swift标签未更新帧,swift,uitableview,autolayout,uilabel,Swift,Uitableview,Autolayout,Uilabel,目前,我正在创建一个表视图,其中包含一个imageView,作为单元格内的主UI项,并且在顶部有一个标签。现在我面临一个问题,对于长文本,标签的框架不准确,对于长文本,它占用了大量空间,似乎有换行符,但没有,这就是问题: 这是标签的属性 这是我的ViewController和我正在使用的约束 其他细节 对于单元格,我没有添加额外的代码,我只有IBOutlets,没有更多 在cellforrowatinexpath上,除了设置图像和文本之外,我没有做更多的代码 感谢您尝试更改标签的内容优先权

目前,我正在创建一个表视图,其中包含一个
imageView
,作为单元格内的主UI项,并且在顶部有一个标签。现在我面临一个问题,对于长文本,标签的框架不准确,对于长文本,它占用了大量空间,似乎有换行符,但没有,这就是问题:

这是标签的属性

这是我的
ViewController
和我正在使用的约束

其他细节

  • 对于单元格,我没有添加额外的代码,我只有
    IBOutlets
    ,没有更多
  • cellforrowatinexpath
    上,除了设置图像和文本之外,我没有做更多的代码

  • 感谢您尝试更改标签的内容优先权。您选择的字体(Noto Nastaliq Urdu Bold)具有非常特定的类型布局属性

    将其与默认系统字体进行比较

    使用此代码:

        let fontDefault = UIFont.systemFont(ofSize: 17.0, weight: .bold)
        guard let fontNotoBld = UIFont(name: "NotoNastaliqUrdu-Bold", size: 17) else {
            fatalError("Could not create font!")
        }
    
        print("fontDefault.lineHeight:\t",fontDefault.lineHeight)
        print("fontNotoBld.lineHeight:\t",fontNotoBld.lineHeight)
        print()
        
        print("fontDefault.ascender:\t",fontDefault.ascender)
        print("fontNotoBld.ascender:\t",fontNotoBld.ascender)
        print()
    
        print("fontDefault.descender:\t",fontDefault.descender)
        print("fontNotoBld.descender:\t",fontNotoBld.descender)
        print()
    
        print("fontDefault.xHeight:\t",fontDefault.xHeight)
        print("fontNotoBld.xHeight:\t",fontNotoBld.xHeight)
        print()
    
        print("fontDefault.capHeight:\t",fontDefault.capHeight)
        print("fontNotoBld.capHeight:\t",fontNotoBld.capHeight)
        print()
    
    我们在调试控制台中获得以下输出:

    fontDefault.lineHeight:  20.287109375
    fontNotoBld.lineHeight:  42.5
    
    fontDefault.ascender:    16.1865234375
    fontNotoBld.ascender:    32.368
    
    fontDefault.descender:   -4.1005859375
    fontNotoBld.descender:   -10.132000000000001
    
    fontDefault.xHeight:     9.13916015625
    fontNotoBld.xHeight:     9.112
    
    fontDefault.capHeight:   11.97802734375
    fontNotoBld.capHeight:   12.138000000000002
    
    我不知道确切的原因,但我的假设是Noto Nastaliq Urdu支持更多的语言字符,这些字符的形状和高度往往非常不同

    您可以使用更标准的字体,也可以设计UI以适应更大的间距


    编辑

    您可以尝试使用具有行高设置的属性文本。但是,它会影响文本的顶部间距,可能不够

    下面是一个带有3个标签的示例:

    • 顶部标签使用默认设置

    • 第二个标签将maximumLineHeight更改为17

    • 第三个标签将maximumLineHeight更改为26

        let titleText = "Label with enough text to cause word wrapping onto multiple lines."
      
        guard let fontNotoBold = UIFont(name: "NotoNastaliqUrdu-Bold", size: 17) else {
            fatalError("Could not create font!")
        }
      
        // without paragraphStyle attribute
        var attrString = NSMutableAttributedString(string: titleText)
        attrString.addAttribute(NSAttributedString.Key.font, value: fontNotoBold, range:NSMakeRange(0, attrString.length))
        label1.attributedText = attrString
      
        // with paragraphStyle max line height: 17
        let ps2 = NSMutableParagraphStyle()
        ps2.maximumLineHeight = 17
        attrString = NSMutableAttributedString(string: titleText)
        attrString.addAttribute(NSAttributedString.Key.font, value: fontNotoBold, range:NSMakeRange(0, attrString.length))
        attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value:ps2, range:NSMakeRange(0, attrString.length))
        label2.attributedText = attrString
      
        // with paragraphStyle max line height: 26
        let ps3 = NSMutableParagraphStyle()
        ps3.maximumLineHeight = 26
        attrString = NSMutableAttributedString(string: titleText)
        attrString.addAttribute(NSAttributedString.Key.font, value: fontNotoBold, range:NSMakeRange(0, attrString.length))
        attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value:ps3, range:NSMakeRange(0, attrString.length))
        label3.attributedText = attrString
      
    结果如下:


    通过更多的实验,例如在开始时添加一个换行符(
    “\n”
    ),您可能能够使它达到令人满意的外观。

    您是否尝试在实际设备上运行它?这是否回答了您的问题?