NSLayoutConstraints未设置(swift 3)

时间:2017-05-14 23:33:54

标签: ios swift xcode nslayoutconstraint

我正在使用来自核心数据的文本数据来确定消息容器框架的大小,但是如果有意义的话,框架似乎没有足够快地设置。我尝试将代码放在override layoutSubviews和setupViews中无济于事。

以下是设置messageContainer框架的代码

    if let messageText = cell?.text {
        let size = CGSize(width: 100, height: 40)
        let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
        let estimatedFrame = NSString(string: messageText).boundingRect(with: size, options: options, attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 12)], context: nil)



        messageContainer.translatesAutoresizingMaskIntoConstraints = false
        messageContainer.frame.size.width = estimatedFrame.width
        messageContainer.frame.size.height = estimatedFrame.height



        addConstraint(NSLayoutConstraint(item: messageLabel, attribute: .left , relatedBy: .equal, toItem: messageContainer, attribute: .left, multiplier: 1, constant: 5))

        addConstraint(NSLayoutConstraint(item: messageLabel, attribute: .width , relatedBy: .lessThanOrEqual, toItem: messageContainer, attribute: .width, multiplier: 1, constant: 0))

        addConstraint(NSLayoutConstraint(item: messageLabel, attribute: .height , relatedBy: .lessThanOrEqual, toItem: messageContainer, attribute: .height, multiplier: 1, constant: 0))



    }

现在,文本只是在屏幕上运行而不会换行。

有什么建议吗?

编辑:我已经在messageLabel后面包含了容器应该是什么样子的截图。这个版本和当前版本之间的区别在于当前版本正在使用自动布局,我认为这是造成问题的原因... enter image description here

1 个答案:

答案 0 :(得分:0)

问题:

根据您设置的约束,自动布局系统强制执行:

messageLabel.width< = messageContainer.width

但这可能不是你想要的。

解决方案:

你的真正目的是对权利施加限制。

  • 删除宽度约束。
  • 不要设置messageContainer的框架,使用约束。
  • 将所有这些设置在单元格的初始化程序中。

messageLabel.right< = messageContainer.right

代码:

addConstraint(NSLayoutConstraint(item: messageLabel, attribute: .right , relatedBy: . lessThanOrEqual, toItem: messageContainer, attribute: .right, multiplier: 1, constant: -5))

注意:

请测试一下,看看它是否符合您的要求。

首选解决方案:

如果你能使用以下内容会很好: