Swift标签由于字体大小更改而未更新框架

问题描述

当前,我正在创建一个表格视图,其中包含一个df <- structure(list(x = c(-0.951618567265016,-0.0450277248089203,-0.784904469457076,-1.66794193658814,-0.380226520287762,0.918996609060766,-0.575346962608392,0.607964322225033,-1.61788270828916,-0.0555619655245394 ),y = c(0.519407203943462,0.301153362166714,0.105676194148943,-0.640706008305376,-0.849704346033582,-1.02412879060491,0.117646597100126,-0.947474614184802,-0.490557443700668,-0.256092192198247),color = structure(c(1L,1L,2L,3L,4L ),.Label = c("1","2","3","4"),class = "factor"),shape = structure(c(1L,1L),"3"),class = "factor")),class = "data.frame",row.names = c(NA,-10L)) g <- ggplot() + geom_point(data = df,aes(x = x,y = y,colour = color,shape = shape)) + theme(legend.position = "right") 作为单元格内的主UI项,并在顶部带有标签。现在,我面临一个问题,对于长文本,标签的框架不准确;对于长文本,它占用了大量空间,似乎有换行符,但没有,这是问题:

Label issue

这是标签属性 Label properties

这是我的imageView和我正在使用的约束 View Controller on Storyboard

其他详细信息

  1. 对于该单元,我没有添加额外的代码,只有ViewController而已。
  2. IBOutlets上,除了设置图像和文本之外,我没有做其他代码

谢谢

解决方法

尝试更改包含标签优先级的内容

,

您选择的字体-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,attrString.length))
      attrString.addAttribute(NSAttributedString.Key.paragraphStyle,value:ps2,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:ps3,attrString.length))
      label3.attributedText = attrString
    

结果如下:

enter image description here

通过更多的实验,例如在开头添加换行符("\n"),您也许可以使它看起来令人满意。