首页 > 解决方案 > 在 UILabel 中拟合文本 - Swift

问题描述

我正在努力将文本放入 UILabel。我希望 UILabel 的宽度保持不变,但我希望文本的字体大小发生变化,以便所有文本都能够适合标签。我基本上是在创建一个带有文本项的菜单栏:今天、明天、本周、下周。这是我的标签设置:

class MenuCell: BaseCell {

let dateLabel: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.backgroundColor = UIColor(red: 247/255, green: 199/255, blue: 199/255, alpha: 1)
    label.sizeToFit()
    label.textAlignment = .center
    label.adjustsFontForContentSizeCategory = true
    label.allowsDefaultTighteningForTruncation = true
    label.numberOfLines  =   2
    label.lineBreakMode  =  NSLineBreakMode.byTruncatingTail
    label.adjustsFontSizeToFitWidth    =   true
    label.minimumScaleFactor           =    10/UIFont.labelFontSize
    return label
}()

我通过这个函数有特定的宽度高度大小:

func collectionView(_ collectionView: UICollectionView, layout 
 collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: frame.width / 4, height: frame.height)

}

我设置了这些单元格:

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath) as! MenuCell
    cell.dateLabel.text = labelnames[indexPath.item]


  cell.backgroundColor = UIColor(red: 247/255, green: 199/255, blue: 199/255, alpha: 1)

    return cell
}

最终,要将单元格添加到视图中,我这样做:

override func setupViews(){
super.setupViews()
addSubview(dateLabel)
dateLabel.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
}

我将整个视图放在导航栏下方的另一个视图控制器文件中:

lazy var menuBar: MenuBar = {
    let mb = MenuBar()
    mb.homeController = self
    return mb
}()
private func setupMenuBar() {
    view.addSubview(menuBar)
    view.addConstraintsWithFormat(format: "H:|[v0]|", views: menuBar)
    view.addConstraintsWithFormat(format: "V:|-64-[v0(50)]", views: menuBar)    
}

但由于某种原因,我拥有的文本不会更改字体大小以适应 UIlabel 单元格。尝试适合的文本示例: let labelnames = ["Todayyyyyyyyyy","Tomorrow", "This Week", "Next Week"] “Todayyyyyyyyyyy”不会更改字体大小以完全适合。我调整了哪些其他属性来解决我的问题?

标签: iosswiftfontsuilabel

解决方案


选项#1——自动调整

将您的字体大小设置为大并根据需要将其缩小,如下所示:

label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.01

您只需要将初始大小设置为巨大。它只会缩小,不会放大。

这里的缺点是,如果你做一些非常大的事情,比如:

label.font = UIFont.systemFont(ofSize: 500)
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.0001

默认情况下,标签的高度将基于 500。

选项 #2 - 手动调整以获得更紧密的配合

func updateLabel(_ s: String, label: UILabel) {

    var size = 222 as CGFloat
    repeat {
        let textSize = s.size(withAttributes:[.font: UIFont.systemFont(ofSize:size)])
        if textSize.width <= label.frame.width {
            break
        }
        size -= 0.10

    } while (size > 4)
    label.font = UIFont.systemFont(ofSize: size)
    label.text = s
}

快速示例:视频源代码。上部标签使用选项#1,底部标签使用选项#2。

您可以看到选项 #2 比系统管理的方式效果更好。它可能也更占用 CPU 资源,但如果您只为每个标签执行一次,这可能并不重要。

可能是您的标签框架不是您认为的大小,因为您只设置了一个topAnchor。您是否还设置其他人或做宽度限制或其他什么?

如果标签应该填充单元格,您可以执行以下操作:

override func setupViews(){
    super.setupViews()

    addSubview(dateLabel)
    dateLabel.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    dateLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
    dateLabel.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
    dateLabel.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
}

另一个建议是在 Xcode 中运行应用程序,然后使用视图调试器工具——点击这个东西:

查看调试器

这将在 Xcode 中显示屏幕的分解视图,以及所有视图的框架。检查标签是否真的是您认为的尺寸。


推荐阅读