preferredMaxLayoutWidth

preferredMaxLayoutWidth

我尝试使用UILabel制作一个具有一定宽度的preferredMaxLayoutWidth,但是无论我做什么都行不通。你能帮助我吗?我尝试了许多不同的组合来使其正常工作。

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

最佳答案

从您的代码来看,我要说的问题是您没有正确设置约束,并且您正在使用NSLayoutConstraint进行混合,同时使用center设置位置并使用sizeToFit设置大小。

首先,在约束条件中,您已将labelBottomitem参数)与其自身(toItem参数)相关联。我不确定您要达到的目标吗?如果您不熟悉AutoLayout的概念,建议您看一些有关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用于的宽度(如果使用AutoLayout,则为NSLayoutConstraint)。

让我们继续吧!

这是一个如何创建一个标签的示例,该标签固定在其容器视图的底部边缘并且不允许比容器的宽度更宽:(请注意,所有这些操作都可以在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以停止创建约束,否则约束将与我们稍后将创建的约束冲突。这是苹果对此要说的:


  由于自动调整大小蒙版自然会产生完全指定视图位置的约束,因此,使用此方法必须将希望对其应用更灵活约束的任何视图设置为忽略其自动调整蒙版。对于以编程方式创建的视图,应该自己调用此方法。使用允许设置约束的工具创建的视图应该已经设置了此视图。


2.您需要确保在此处放置自己的文本,否则代码将无法运行。

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


  无法解析约束格式:
  无法解释“ |”字符,因为相关视图没有超级视图
  | -8- [标签] -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.最后添加约束!

看起来是这样的:



我希望能回答您的问题。

关于ios - preferredMaxLayoutWidth在Swift中不起作用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29636943/

10-09 02:07