iOS编程:使用自动换行创建标签

3

我想要通过程序创建一个能够自动换行的标签,用于处理长句子。以下是我用来创建标签的循环:

        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

    }

然而这并不起作用。根据我所读的,为了使包装功能正常工作,您需要不设置高度或使高度足够大以适应内容。我必须设置框架的高度,但我不想为长句子设置过大的高度,那么我如何通过编程设置一切使其正常工作呢?


所以我已经让它工作了,但是它似乎通过调整标签的高度来扰乱一切。它将所有标签向下推相同的高度。这会在顶部产生大量空白,并使一些标签超出滚动视图的底部。我该怎么办才能解决这个问题? - user1715916
2个回答

3
为什么不使用自动布局,这样可以支持设备的方向变化。
    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设置为允许标签增长的最大尺寸。

另外,我添加了一个最小高度的约束:

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

在这个例子中,这将确保标签的高度至少为25,并且最多有10行。


感谢您的帖子。我不想支持横向方向,因为应用程序在横向模式下看起来不好。我试图避免在最大高度情况下进行硬编码。我希望它能够自动换行直到完成。我有一些大约一段落长的字符串,还有一些只是一个句子。我尝试了您的代码,但您缺少了一个指示标签初始起点的东西,所以它们都放在了一起。 - user1715916
所以我尝试增加标签的高度和间距,这确实让它们显示出来了,但在第一个标签之前有很多空白空间。这个空间似乎等于我为标签设置的高度。除了这一块空间外,一切看起来都很好。我该如何去掉这个空间呢? - user1715916
抱歉,我的代码有错误,我已经更新了。请再次检查,您在顶部的空间应该没有问题。 - omarzl

0

我决定使用TableView。它给了我我想要的一切。如果您需要显示句子列表并需要单词换行以处理可能很长的句子或段落,那么TableView比编程添加标签要容易得多。 以下是我遵循的步骤:

  1. 按照this教程制作Swift中的TableView。
  2. 在创建单元格的函数中添加cell.textLabel?.numberOfLines = 0以获取单词换行。
  3. 在viewDidLoad中添加yourtableview.estimatedRowHeight = whateveryouwant yourtableview.rowHeight = UITableViewAutomaticDimension以获取行的可变高度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接