iOS 9中UILabel中的多行文本

7

我正在开发一个iOS项目,但当我更新到iOS 9时,在UILabels的多行中出现了一些问题。我正在使用自动布局(Autolayout)

是否有人知道如何在iOS 9中解决这个问题?

我尝试了不同的方法,例如:

textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

(来自其他类似问题)但它没有起作用。

这是我的逻辑以显示多行:

IB配置:

preferedMaxLayout

输入图像说明

标签配置

我通过编程方式更新此值:

- (void)configureLabelsMaxLayoutWidth
{
     [self.view layoutIfNeeded];
     self.titleLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.titleLabel.frame);
}

我在viewWillAppear方法中调用了这个方法。


发生了什么事情?我在iOS 9上有类似的标签工作。 - Peter DeWeese
我正在设置preferredMaxLayoutWidth属性:self.titleLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.titleLabel.frame),但结果仍然相同。我的一行文字末尾有“...”。 - eljec
你可以像这样添加带有换行符的文本:@"line1\nline2",然后调整标签的框架大小以适应文本大小。我是用这种方式实现的。 - theWalker
我正在使用自动布局。谢谢你的回复Skippy,但是我希望标签根据最大宽度截断文本。我的实际实现在iOS 7/8中有效,问题出在iOS 9上:( - eljec
我已经更新了我的问题,展示了多行逻辑(在iOS 9中不起作用)。提前致谢。 - eljec
显示剩余3条评论
4个回答

8
通过将numberOfLines设置为0,您告诉标签成为多行,但是可能有其他因素禁用多行。您正在使用自动布局吗?如果是这样,问题可能是标签的Content Compression Resistance Priority太低,请尝试将其设置为Required1000
内容压缩阻力告诉视图引擎您的标签可以收缩的优先级。将其设置为必需会强制不缩小。
在Interface Builder中,只需选择标签,点击Size Inspector(小尺子),然后将其更改为1000。 enter image description here 或者,在代码中,相当于:
[label setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];

谢谢Simon,我尝试了你的建议,但是没有成功。:( - eljec

3

设置完约束后,请记住preferredMaxLayoutWidth

label.numberOfLines = 0
label.preferredMaxLayoutWidth = superview.bounds.size.width - 20

1
对我来说起作用了!在iOS 10上没有问题,并且它可以使用设计的自动布局配置工作。在iOS 9上,我不得不添加这个preferredMaxLayoutWidth选项.. - Yannick

1
(Swift 4, xCode 9.3.1) 我知道这个答案可能不适用于所有人,但希望它能帮助到某些人。我的情况是我有一个UIScrollView绑定到父视图。我想要在ScrollView中添加一个带有大量文本的UILabel,并使其宽度相等,以便仅垂直滚动。基本上,我想要一个绑定到父视图的垂直滚动UILabel。我遇到的问题是,即使将numberOfLines设置为零,UILabel仍然保持一行。

这是我在ViewController中使用的代码,使其工作。

class DetailsController: UIViewController, UIScrollViewDelegate {

@IBOutlet weak var scrollView: UIScrollView! {
    didSet {
        scrollView.delegate = self
        scrollView.addSubview(detailsLabel)
    }
}

var detailsLabel = UILabel()

let detailsText = "Insert lots of text here"

override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    detailsLabel.numberOfLines = 0
    detailsLabel.text = detailsText + detailsText
    detailsLabel.frame.size.width = (scrollView?.frame.size.width)!
    detailsLabel.sizeToFit()
    scrollView?.contentSize = detailsLabel.frame.size
}

}

0

我曾经遇到过类似的问题,我需要在最后调用layoutIfNeeded()函数:

textLabel.text = "your loooooooong text"
textLabel.lineBreakMode = .ByWordWrapping
textLabel.numberOfLines = 0
textLabel.layoutIfNeeded()

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