【问题标题】:Creating UILabel programmatically with constraints?使用约束以编程方式创建 UILabel?
【发布时间】:2019-05-30 10:32:20
【问题描述】:

我想要做的是每次在我的代码中发生特定操作时以编程方式创建一个新的 UILabel。我知道我想给标签的 x、y 和高度,但我不想给它一个固定的宽度。我想约束边,使 UILabel 宽度等于屏幕的宽度,并且如果方向翻转,标签宽度会改变。

我考虑过使用:

CGRect(x:, y:, width:, height:)

但是,如果我使用它,我必须给它一个固定的宽度,所以我认为它不会起作用。

我也尝试过使用:

CGPoint(x:, y:)

然后设置前导、尾随和高度锚,然而,这似乎也不起作用,因为即使它编译,当我尝试创建新的 UILabel 时出现错误。

我对 Swift 编程有点陌生,所以我不确定是否有明显的解决方法。

【问题讨论】:

标签: swift xcode constraints uilabel


【解决方案1】:

您可以使用以下代码以编程方式创建 UILabel。

private let label: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.numberOfLines = 0
    label.text = "Hello World"
    return label
}()

然后在你的 viewDidLoad() 中

addSubview(label)
NSLayoutConstraint.activate([
    topAnchor.constraint(equalTo: label.topAnchor),
    bottomAnchor.constraint(equalTo: label.bottomAnchor),
    leadingAnchor.constraint(equalTo: label.leadingAnchor),
    trailingAnchor.constraint(equalTo: label.trailingAnchor)
])

【讨论】:

  • 为什么第二部分需要在viewDidLoad中?我可以在创建标签的同一函数中包含第二部分(约束)吗(假设我在函数中创建标签)?
【解决方案2】:

正如你所说,我们已经为label 提供了x, y and height,即

let x: CGFloat = 0
let y: CGFloat = 0
let height: CGFloat = 50

让我们使用上述详细信息创建一个label。还可以根据您的要求将labelwidth 设置为UIScreen.main.bounds.width

let label = UILabel(frame: CGRect(x: x, y: y, width: UIScreen.main.bounds.width, height: height))
label.text = "This is a sample text"

不要忘记将label's translatesAutoresizingMaskIntoConstraints 设置为false 并将其添加到您想要的任何subview

label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)

添加label 的相关constraints 及其superview - top, bottom, leading, height。如果需要,您绝对可以添加bottom constraint。这完全取决于您的 UI。

我将label 添加到top of the viewController's view

NSLayoutConstraint.activate([
    label.heightAnchor.constraint(equalToConstant: height),
    view.topAnchor.constraint(equalTo: label.topAnchor),
    view.leadingAnchor.constraint(equalTo: label.leadingAnchor),
    view.trailingAnchor.constraint(equalTo: label.trailingAnchor)
    ])

【讨论】:

  • 即使我已经在 CGRect() 中设置了高度,是否还需要添加高度约束?另外,设置视图约束等于标签,还是标签等于视图更好?
  • 如果你有身高,你肯定可以。
  • 出于某种原因,“label.translatesAutoresizingMaskIntoConstraints = false”行给我带来了问题(将 y 位置更改为 0)。当我将其注释掉时,标签的位置正确,但使用它时,标签位于视图的最顶部。
  • 你使用了哪些约束?如果您使用的是autolayoutlabel.translatesAutoresizingMaskIntoConstraints 必须是 false,否则可能会产生意想不到的结果。
  • 我添加了您建议的约束,但对于前导和尾随锚点进行了切换,以便(例如)label.leadingAnchor.constraint(equalTo: view.leadingAnchor)。我在自动布局中还有许多其他限制,但对于与标签完全无关的不同事物(例如按钮等)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 2015-10-17
相关资源
最近更新 更多