preferredMaxLayoutWidth 在 Swift 中不起作用?

preferredMaxLayoutWidth not working in Swift?

我曾尝试使用 preferredMaxLayoutWidth 制作一个具有一定宽度的 UILabel,但无论我做什么都行不通。你能帮助我吗?我尝试了很多不同的组合来让它发挥作用。

@IBAction func addBottomTextButton(sender: AnyObject) {

   if addBottomTextField.text.isEmpty == false {
      let halfScreenWidth = screenSize.width * 0.5
      let bottomScreenPosition = screenSize.width
      memeBottomText = addBottomTextField.text
      fontName = "Impact"
      let memeBottomTextCaps = memeBottomText.uppercaseString // --> THIS IS A STRING!

      labelBottom.text = memeBottomTextCaps
      labelBottom.textColor = UIColor.blackColor()
      labelBottom.textAlignment = .Center
      labelBottom.font = UIFont(name: fontName, size: 32.0)
      labelBottom.sizeToFit()

      labelBottom.userInteractionEnabled = true
      labelBottom.adjustsFontSizeToFitWidth = true
      labelBottom.numberOfLines = 1
      labelBottom.preferredMaxLayoutWidth = screenSize.width
      labelBottom.setTranslatesAutoresizingMaskIntoConstraints(true)

      var r = CGFloat(halfScreenWidth)
      var s = CGFloat(bottomScreenPosition)
      labelBottom.center = CGPoint(x: r, y: s)

      self.view.addSubview(labelBottom)
      self.view.addConstraint(NSLayoutConstraint(item: labelBottom, attribute:
         NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: labelBottom,     
         attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 0))

      dismissKeyboard()
   }
}

根据你的代码判断,我会说你的问题是你没有正确设置你的约束,你正在混合使用 NSLayoutConstraints 和使用 center 设置位置并设置大小使用 sizeToFit.

首先, 在您设置的约束中,您将 labelBottomitem 参数)与其自身(toItem 争论)。我不太确定你想用它达到什么目的?如果您不熟悉其概念,我建议您查看一些有关 AutoLayout 的教程。这是一个很好的:http://www.raywenderlich.com/50317/beginning-auto-layout-tutorial-in-ios-7-part-1

其次,只是一个小问题,在let memeBottomTextCaps = memeBottomText.uppercaseString行你写了// --> THIS IS A STRING。回顾代码时提醒自己变量类型的一种更简单的方法是使用:let memeBottomTextCaps: String = memeBottomText.uppercaseString

第三, preferredMaxLayoutWidth 不用于设置 UILabel 的宽度 - 这就是 frame 的用途(或NSLayoutConstraints 如果您使用的是自动版式)。

我们继续吧!

这是一个示例,说明如何创建固定到其容器视图底部边缘并且不允许比容器更宽的标签:(请记住,所有这些都可以在 IB 中完成)

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let label = UILabel()
        // 1.
        label.setTranslatesAutoresizingMaskIntoConstraints(false)
        // 2.
        label.text = // Put your text here.

        // 3.
        self.view.addSubview(label)

        // 4.
        let pinToBottomConstraint = NSLayoutConstraint(item: label,
            attribute: .Bottom,
            relatedBy: .Equal,
            toItem: self.view,
            attribute: .Bottom,
            multiplier: 1.0,
            constant: -8.0)

        // 5.
        let horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("|-8-[label]-8-|",
            options: .DirectionLeadingToTrailing,
            metrics: nil,
            views: ["label" : label])

        // 6.
        self.view.addConstraint(pinToBottomConstraint)
        self.view.addConstraints(horizontalConstraints)
    }
}

以下引用上面代码中注释的数字。

1. 您需要将 setTranslatesAutoresizingMaskIntoConstraints 设置为 false 以停止创建约束,否则会与我们要创建的约束发生冲突之后。以下是 Apple 对此的评价:

Because the autoresizing mask naturally gives rise to constraints that fully specify a view’s position, any view that you wish to apply more flexible constraints to must be set to ignore its autoresizing mask using this method. You should call this method yourself for programmatically created views. Views created using a tool that allows setting constraints should have this set already.

2. 你需要确保你在这里输入了你自己的文字,否则代码不会运行.

3. 标签 必须 添加到视图层次结构中,然后才能在它和它的父视图之间添加约束!否则,在这种情况下,您会收到 运行 时间错误:

Unable to parse constraint format: Unable to interpret '|' character, because the related view doesn't have a superview |-8-[label]-8-|

这是因为我们 horizontalConstraints 需要知道标签的父视图(父视图由 "|" 表示)但标签没有父视图。

4. pinToBottomConstraint 约束按照它说的去做。 -8 的常量只是指定我希望标签距其容器视图底部 8 点。

我们 不需要 创建一个约束来指定标签的大小 - 这是 UILabel 的固有 属性 确定的,因为例如,按行数和字体。

5. horiontalConstraints 是使用视觉格式语言创建的。这是一个很好的教程:http://code.tutsplus.com/tutorials/introduction-to-the-visual-format-language--cms-22715 基本上,"|-8-[label]-8-|" 创建约束以将标签的左右边缘固定到其父视图的左右边缘。

6. 最后加上约束!

这是它的样子:

我希望这能回答你的问题。

我认为 属性 只适用于多行情况。

// Support for constraint-based layout (auto layout)
// If nonzero, this is used when determining -intrinsicContentSize for multiline labels
@available(iOS 6.0, *)
open var preferredMaxLayoutWidth: CGFloat

经过我的测试,确实如此。所以,我们需要设置多行。它会起作用。

titleLabel.numberOfLines = 0

我不明白为什么 Apple 将其限制为仅多行。事实上,我们经常需要通过一个 属性.

轻松地设置标签上的最大宽度

最后,如果我们要设置最大宽度,我们需要设置最大约束,如下所示

        if device.isNew == "1" {

            self.title.mas_updateConstraints { (make) in
                    make?.width.lessThanOrEqualTo()(163.w)
            }

            self.newTag.isHidden = false
        } else {

            self.newTag.isHidden = true

            self.title.mas_updateConstraints { (make) in
                make?.width.lessThanOrEqualTo()(207.w)
            }

        }