Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 基于视图设置NSLayoutConstraint常量';屏幕高度_Ios_Swift_Autolayout_Nslayoutconstraint - Fatal编程技术网

Ios 基于视图设置NSLayoutConstraint常量';屏幕高度

Ios 基于视图设置NSLayoutConstraint常量';屏幕高度,ios,swift,autolayout,nslayoutconstraint,Ios,Swift,Autolayout,Nslayoutconstraint,我以编程方式创建了一个自动布局约束,该约束将标签从其父视图的底部向上移动25个点。我在此场景中没有定义其他约束。25在大多数设备上都可以,但在iPhone4S上太高了。我想让它从底部向上大约15个屏幕大小。但后来我想,最好是获得一个可变常量,而不是对所有屏幕大小强制执行一个固定值,或者尝试将其更改为一个特定的屏幕大小。但这似乎不可能与自动布局。是吗 我在想获得可变常数的一种方法是根据屏幕(或视图)高度计算一个值。例如,该常量将等于self.view.frame.size.height/30。在i

我以编程方式创建了一个自动布局约束,该约束将标签从其父视图的底部向上移动25个点。我在此场景中没有定义其他约束。25在大多数设备上都可以,但在iPhone4S上太高了。我想让它从底部向上大约15个屏幕大小。但后来我想,最好是获得一个可变常量,而不是对所有屏幕大小强制执行一个固定值,或者尝试将其更改为一个特定的屏幕大小。但这似乎不可能与自动布局。是吗

我在想获得可变常数的一种方法是根据屏幕(或视图)高度计算一个值。例如,该常量将等于
self.view.frame.size.height/30
。在iPhone4上(仅限于肖像),它将是16,iPhone5将是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%

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"
}

我不会将约束直接指定给视图

我想:

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

    • (instancetype)constraintWithItem:(id)视图1 属性:(NSLayoutAttribute)属性1 relatedBy:(NSLayoutRelation)关系 toItem:(id)视图2 属性:(NSLayoutAttribute)属性2 乘法器:(CGFloat)乘法器 常数:(CGFloat)c
  • 使用self.view.addConstraint将约束添加到视图中

  • 当方向改变或基于设备时,为该约束指定不同的值(使用.constant)

  • 我在想获得可变常数的一种方法是 根据屏幕(或视图)高度计算一个值。例如 该常数将等于self.view.frame.size.height/30。在…上 iPhone4(仅限肖像)将是16部,iPhone5几乎是16部 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%。

    当您以编程方式说时,是指您在代码中还是在情节提要中创建了约束?@Spectravideo328 in code,在
    viewDidLoad
    中,您不能使用:self.myConstraint.constant=myVariableDistanceValue@Spectravideo328嗯,我没有存储对约束的引用,在
    viewDidLoad
    中,它不知道视图的大小,并且必须在大小更改(旋转)时进行更新。你能显示你的viewDidLoad代码吗?回答很好!你让我开心,我很高兴我终于学会了乘法器的功能!