SizeToFit()无法与\ n一起正常使用?

时间:2018-12-08 21:18:18

标签: ios swift label uilabel sizetofit

我以编程方式创建标签。它总是有两行。但是,这两行的字体大小将改变。因此,标签的高度和宽度将必须更改。我尝试使用sizeToFit做到这一点。但是,第二个单词(“日”)仅被部分显示。该单词的底部被切除。好像sizeToFit无法识别该文本实际上是两行。好像sizeToFit正在调整标签的大小以适合一行。我该如何解决?谢谢。

let screenWidth = UIScreen.main.bounds.width
let screenWidthHalf = screenWidth/2.0
let screenHeight = UIScreen.main.bounds.height
myLabel = UILabel()
myLabel.text = "Good \n Day"
myLabel.textAlignment = .center
let myLabelFontSize = 12.0*screenHeight/667
let myLabelFont = UIFont.systemFont(ofSize: myLabelFontSize)
myLabel.font = myLabelFont
myLabel.numberOfLines = 0
myLabel.sizeToFit()
let myLabelWidth = myLabel.frame.width
let myLabelWidthHalf = myLabelWidth/2.0
let myLabelX = screenWidthHalf - myLabelWidthHalf
let myLabelY = 142.5
myLabel.frame.origin.x = myLabelX
myLabel.frame.origin.y = myLabelY
scrollView.addSubview(myLabel)

1 个答案:

答案 0 :(得分:0)

我喜欢使用Lets Build That App频道(检出Facebook News Feed动态单元内容)提供的方法,而不是sizeToFit。我确实使用滚动视图。这是我用来获取高度的典型方法。绝对要考虑字体大小,换行符以及我能够提供的几乎所有其他功能。

基本上,方法如下,当我布置视图时,我根据视图的内容计算了每个视图的估计大小,然后使用这些计算来相应地更新框架。我创建了UILabel的扩展以简化此过程。您确实需要至少清除高度或宽度。通常宽度是透明的。

extension UILabel {
  func getEstimatedHeight(width: CGFloat) -> CGFloat {
    let size = CGSize(width: width, height: 1000)
    let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
    let estimatedFrame = NSString(string: self.text ?? "").boundingRect(with: size, options: options, attributes: [NSAttributedStringKey.font: self.font], context: nil)
    return estimatedFrame.height
  }
}

返回高度后,您可能还必须在其身高上添加一个“模糊”因子。

 let myViewEstimatedHeight = toView.getEstimatedHeight(width: width - 100)
 myView.view.frame = CGRect(x: 20, y: 20, width: width, 
       height: myViewEstimatedHeight + 3)