【问题标题】:iOS: Create Label Programmatically with Word WrapiOS:使用自动换行以编程方式创建标签
【发布时间】:2017-01-27 15:35:43
【问题描述】:

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

        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

    }

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

【问题讨论】:

  • 所以我让它工作了,除了它似乎通过调整标签的高度来扔掉东西。它将所有标签向下推的量与我将高度更改为相同的量。这会导致顶部有大量空白,并且一些标签会超出滚动视图的底部。我能做些什么来解决这个问题?

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


【解决方案1】:

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

    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 行。

【讨论】:

  • 感谢您的帖子。我不想支持水平方向,因为该应用在横向上看起来不太好。我试图避免在最大高度情况下进行硬编码。我希望我能把它包起来,直到它完成。我有一些字符串大约是一个段落长,而其他字符串只是一个句子。我尝试了你的代码和你缺少的东西,它告诉标签的初始起点在哪里,所以它们都放在彼此的顶部。
  • 所以我尝试增加标签之间的高度和空间,这确实允许它们显示,但我在第一个标签之前的顶部有很多空白空间。空间似乎等于我为标签输入的高度。除了大块的空间外,一切看起来都很棒。我该如何摆脱它?
  • 对不起,我的代码有错误,我更新了。请再检查一遍,顶部的空间应该没有问题。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多