preferredMaxLayoutWidth无法在Swift中运行?

时间:2015-04-14 20:35:40

标签: ios swift uilabel

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

@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()
   }
}

2 个答案:

答案 0 :(得分:1)

根据您的代码判断我说您的问题是您没有正确设置约束,并且使用NSLayoutConstraint进行混合,并使用{{1}设置位置并使用center设置大小。

首先,在您设置的约束中,您将sizeToFitlabelBottom参数)与自身相关联(item参数)。我不完全确定你想要实现的目标是什么?如果您不熟悉其概念,我建议您查看有关AutoLayout的一些教程。这是一个很好的:http://www.raywenderlich.com/50317/beginning-auto-layout-tutorial-in-ios-7-part-1

其次,只是您在toItem let memeBottomTextCaps = memeBottomText.uppercaseString行上写的一小部分。回顾代码时,更容易提醒自己变量类型的方法可能是:// --> THIS IS A STRING

第三, let memeBottomTextCaps: String = memeBottomText.uppercaseString并非用于设置preferredMaxLayoutWidth的宽度 - 这是UILabel的用途(&{39}}或frame s,如果您正在使用AutoLayout)。

让我们继续吧!

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

NSLayoutConstraint

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

1。您需要将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) } } 设置为setTranslatesAutoresizingMaskIntoConstraints以停止创建的约束,否则会与我们稍后要创建的约束冲突。这就是Apple对此所说的话:

  

因为自动调整遮罩自然会产生完全指定视图位置的约束,所以必须将要应用更灵活约束的任何视图设置为使用此方法忽略其自动调整遮罩。您应该自己为编程创建的视图调用此方法。使用允许设置约束的工具创建的视图应该已经具有此设置。

2。您需要确保在此处输入自己的文字,否则代码将无法运行。

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

  

无法解析约束格式:   无法解释' |'角色,因为相关视图没有超级视图   | -8- [标号] -8- |

这是因为我们false需要知道标签的超级视图(超级视图由horizontalConstraints表示),但标签没有超级视图。

4. "|"约束符合它的说法。常量pinToBottomConstraint只是指定我希望标签从容器视图的底部开始是8个点。

我们没有需要来创建约束来指定标签的大小 - 这是-8确定的内在属性,例如,按行数和字体数。

5. UILabel是使用Visual Format语言创建的。这是一个很好的教程:http://code.tutsplus.com/tutorials/introduction-to-the-visual-format-language--cms-22715基本上,horiontalConstraints会创建约束,将标签的左右边缘固定到其超视图的左右边缘。

6。最后添加约束!

这就是它的样子:

enter image description here

我希望能回答你的问题。

答案 1 :(得分:0)

我认为该物业仅适用于多线情况。

recreate()

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

// 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

我不解释为什么Apple将其限制为仅多行。实际上,我们经常需要通过一个属性轻松设置标签的最大宽度。

最后,如果要设置max width,则需要设置max constaint,如下所示:

titleLabel.numberOfLines = 0