iOS:使用Word Wrap以编程方式创建标签

时间:2016-09-19 20:41:44

标签: ios swift uilabel word-wrap programmatically-created

我想以编程方式创建一个能够对长句进行自动换行的标签。这是我创建标签的循环:

        for i in 0..<servicesLength
    {
        let label = UILabel(frame: CGRectMake(0, number, servicesScroll.bounds.size.width - 42, 25))
        label.lineBreakMode = .ByWordWrapping
        label.numberOfLines = 0
        label.font = UIFont(name: label.font.fontName, size: 25)
        label.text = servicesList[i]
        self.servicesScroll.addSubview(label)
        number = number + 50

    }

但这不起作用。根据我的阅读,为了使包装工作,你需要不设置高度或使高度足够大的内容。我必须设置框架的高度,我不想让它对于大句子来说非常大,所以如何通过以编程方式设置所有内容来使其工作?

2 个答案:

答案 0 :(得分:2)

为什么不使用Autolayout,这也可以让您支持设备上的方向更改。

    var lastLabel:UILabel?

    for i in 0..<10servicesLength
    {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints=false
        label.lineBreakMode = .ByWordWrapping
        label.numberOfLines = 10
        label.font = UIFont(name: label.font.fontName, size: 25)
        label.text = servicesList[i]
        servicesScroll.addSubview(label)

        let metrics=["horizontalMargin":21,"top":0,"bottom":0,"separationBetweenLabels":0,"labelMinHeight":25]
        let views=["label":label]

        servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-horizontalMargin-[label]-horizontalMargin-|",
            options: NSLayoutFormatOptions(rawValue: 0),
            metrics: metrics,
            views: views))

        if i == 0{
            servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-top-[label]",
                options: NSLayoutFormatOptions(rawValue: 0),
                metrics: metrics,
                views: views))
        }
        if let lastLabel=lastLabel{
            views["lastLabel"]=lastLabel
            servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[lastLabel]-separationBetweenLabels-[label]",
                options: NSLayoutFormatOptions(rawValue: 0),
                metrics: metrics,
                views: views))
        }
        if i == (servicesLength-1){
            servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label]-bottom-|",
                options: NSLayoutFormatOptions(rawValue: 0),
                metrics: metrics,
                views: views))
        }

        //Optional a minimum height of 25
        servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label(>=labelMinHeight)]",
            options: NSLayoutFormatOptions(rawValue: 0),
            metrics: metrics,
            views: views))

        lastLabel=label
    }

重要的是,您要将每个标签的numberOfLines设置为允许标签增长的最大尺寸。

我还为miminum高度添加了一个约束:

    //Optional a minimum height of 25
    servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label(25)]",
        options: NSLayoutFormatOptions(rawValue: 0),
        metrics: metrics,
        views: views))

这将保证标签在此示例中至少为25个高度,最多为10行。

答案 1 :(得分:0)

我决定使用TableView。它给了我正是我想要的东西。如果您需要显示的句子列表并且需要对可能较大的句子或段落进行自动换行,那么tableview比以编程方式添加标签要容易得多。 以下是我遵循的步骤:

  1. 关注如何在Swift中制作tableview的this教程。
  2. cell.textLabel?.numberOfLines = 0添加到创建单元格的函数中,以便进行自动换行。
  3. 添加yourtableview.estimatedRowHeight = whateveryouwant yourtableview.rowHeight = UITableViewAutomaticDimension 在viewDidLoad中,以获得行的可变高度。