在UILabel中调整文本-Swift

时间:2018-09-22 00:57:46

标签: ios swift fonts uilabel

我正在努力使文本适合UILabel。我希望UILabel的宽度是恒定的,但我希望更改文本的字体大小,以便所有文本都能够适合标签。我基本上是用文本项创建一个菜单栏:今天,明天,本周,下周。 这是我的标签设置:

.header a {
    float: left; /* new line */
}

我通过此功能具有特定的宽度,高度尺寸:

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
}

但是由于某些原因,我拥有的文本不会更改字体大小以适合UIlabel单元格。 试图适合的文本示例: 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) } “ Todayyyyyyyyyy”未更改字体大小以使其完全适合。我需要调整其他哪些属性来解决问题?

2 个答案:

答案 0 :(得分:0)

选项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
}

快速样本:videosource code。 上面的标签使用选项#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中运行该应用程序,然后使用视图调试器工具-单击此东西:

view debugger

这将显示Xcode屏幕的分解图,以及所有视图的框架。检查标签是否真的符合您的想法。

答案 1 :(得分:0)

这就是我要这样做的方式(我喜欢使用@IBDesignable,因此我也可以在情节提要中自由使用它)

extension UIFont {
    func sizeOfString (string: String, constrainedToWidth width: Double) -> CGSize {
        return NSString(string: string).boundingRect(with: CGSize(width: width, height: Double.greatestFiniteMagnitude),
                                                     options: NSStringDrawingOptions.usesLineFragmentOrigin,
                                                             attributes: [NSAttributedStringKey.font: self],
                                                             context: nil).size
    }
}

@IBDesignable public class TestLabel: UILabel {
    @IBInspectable public var autoResize: Bool = false {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var resizeStep: CGFloat = 1.0 {
        didSet {
            decorate()
        }
    }

    func decorate() {
        // Here you can change whatever you want

        var bestFontSize: CGFloat = 1
        var testedFontSize: CGSize = self.font.withSize(bestFontSize).sizeOfString(string: self.text!, constrainedToWidth: Double.greatestFiniteMagnitude)
        while testedFontSize.width < self.frame.width && testedFontSize.height < self.frame.height {
            bestFontSize += 1
            testedFontSize = self.font.withSize(bestFontSize).sizeOfString(string: self.text!, constrainedToWidth: Double.greatestFiniteMagnitude)
        }
        self.font = self.font.withSize(bestFontSize - self.resizeStep)
    }
}

我只是在操场上对其进行了测试,所以我没有按照我的意图完全检查它是否在情节提要中正常工作,但是它应该功能完善,尽管它对bounds或{{1}不太在意},但这只是说明如何使用它。

不过,仍然不建议从设计角度进行此操作。