根据视图的高度或屏幕高度设置NSLayoutConstraint常量

时间:2014-11-16 04:50:34

标签: ios swift autolayout nslayoutconstraint

我已经以编程方式创建了一个自动布局约束,可以将标签从其父视图的底部向上移动25个点。我在这个场景中没有定义其他约束。 25在大多数设备上都很好,但它在iPhone 4s上太过分了。我想从屏幕底部大约15个屏幕尺寸。但后来我认为获得一个变量常量而不是对所有屏幕尺寸强制执行固定值,或尝试将其更改为一个特定的屏幕尺寸会更好。但是,使用自动布局似乎无法做到这一点。是吗?

我在想一种获取变量常量的方法是根据屏幕(或视图)高度计算一个值。例如,常量将等于self.view.frame.size.height / 30。在iPhone 4(仅限肖像)上它将是16,iPhone 5将近19,等等。这将是完美的。或者另一种方式,高度的3%。这些值在旋转时需要是动态的,因为高度会发生变化。

是否可以根据某些计算或屏幕/视图高度使用具有可变常量的自动布局约束?或者是否有其他解决方案可以让我获得所需的行为 - 避免固定的自动布局常量?

这里有一些示例代码,来自viewDidLoad

let footerLabel = UILabel()
footerLabel.text = "my text"
footerLabel.sizeToFit()
footerLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(footerLabel)
self.view.addConstraint(NSLayoutConstraint(item: footerLabel, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1, constant: -25))
self.view.addConstraint(NSLayoutConstraint(item: footerLabel, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0))

3 个答案:

答案 0 :(得分:1)

您可以设置" spacer"高度被限制为view的3%的视图。

override func viewDidLoad() {
    super.viewDidLoad()

    let label = UILabel()
    let spacer = UIView()

    label.setTranslatesAutoresizingMaskIntoConstraints(false)
    spacer.setTranslatesAutoresizingMaskIntoConstraints(false)
    spacer.hidden = true

    view.addSubview(spacer)
    view.addSubview(label)
    var views = ["spacer":spacer, "label":label]
    view.addConstraint(NSLayoutConstraint(item: spacer, attribute: .Height, relatedBy: .Equal, toItem: view, attribute: .Height, multiplier: 0.03, constant: 0))
    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label][spacer]|", options: nil, metrics: nil, views: views))

    view.addConstraint(NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: 0))

    label.backgroundColor = UIColor.purpleColor()
    label.text = "THIS IS MY LABEL"
}

答案 1 :(得分:1)

  

我在想一种获得变量常量的方法   根据屏幕(或视图)高度计算一个值。例如,   常量将等于self.view.frame.size.height / 30.开   iPhone 4(仅限肖像)它将是16,iPhone 5几乎可以   19,等等。这将是完美的。或者另一种方式,高度的3%。   这些值在旋转时需要是动态的,因为   身高会发生变化。

您只需将第一个约束更改为:

self.view.addConstraint(NSLayoutConstraint(item: footerLabel, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 0.97, constant: 1))

保持常数0并将乘数更改为0.97意味着标签的底部始终比视图底部高3%。

答案 2 :(得分:0)

我不会将约束直接分配给视图。

我会:

  1. 为NSLayoutConstraint创建一个变量属性
  2. 在viewDidLoad中,使用此函数对其进行初始化:

    • (instancetype)constraintWithItem:(ID)厂景                      属性:(NSLayoutAttribute)attR1位                      relatedBy:(NSLayoutRelation)关系                         toItem:(ID)视图2                      属性:(NSLayoutAttribute)attR2位                     乘数:(CGFloat的)乘法器                       常数:(CGFloat的)C
  3. 使用self.view.addConstraint

  4. 将约束添加到视图
  5. 当方向更改或基于设备时,为该约束指定不同的值(使用.constant)。