ios - SizeToFit() 不能与 \n 一起正常工作?
问题描述
我以编程方式创建标签。它总是有两条线。但是,这两行的字体大小会发生变化。因此,标签的高度和宽度将不得不改变。我尝试使用 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)
解决方案
我喜欢使用 Lets Build That App 频道(查看 Facebook News Feed Dynamic Cell Content)提供的方法,而不是 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)
推荐阅读
- c++ - 什么时候完整类范围在默认参数、默认成员初始化器和异常规范中真正有用?
- python - Python 乌龟:带有位置的 if 语句有时有效,有时无效
- javascript - 无法在函数生成器中解构对象
- javascript - 已发送回复后停止快递功能
- android - 在不切割其他视图的情况下尽可能扩大视野
- python - 在数据框中查找每月重复值(熊猫)
- python - 如何在 Tensorflow 中替换二维张量中的某些行
- spring-boot - 从哪个版本的 JHipster,Okta 集成是可能的?
- python-3.x - 循环读取多个文件
- angular - 无法访问 Angular 父组件中的 @ViewChild 属性