Ios 基于视图设置NSLayoutConstraint常量';屏幕高度
我以编程方式创建了一个自动布局约束,该约束将标签从其父视图的底部向上移动25个点。我在此场景中没有定义其他约束。25在大多数设备上都可以,但在iPhone4S上太高了。我想让它从底部向上大约15个屏幕大小。但后来我想,最好是获得一个可变常量,而不是对所有屏幕大小强制执行一个固定值,或者尝试将其更改为一个特定的屏幕大小。但这似乎不可能与自动布局。是吗 我在想获得可变常数的一种方法是根据屏幕(或视图)高度计算一个值。例如,该常量将等于Ios 基于视图设置NSLayoutConstraint常量';屏幕高度,ios,swift,autolayout,nslayoutconstraint,Ios,Swift,Autolayout,Nslayoutconstraint,我以编程方式创建了一个自动布局约束,该约束将标签从其父视图的底部向上移动25个点。我在此场景中没有定义其他约束。25在大多数设备上都可以,但在iPhone4S上太高了。我想让它从底部向上大约15个屏幕大小。但后来我想,最好是获得一个可变常量,而不是对所有屏幕大小强制执行一个固定值,或者尝试将其更改为一个特定的屏幕大小。但这似乎不可能与自动布局。是吗 我在想获得可变常数的一种方法是根据屏幕(或视图)高度计算一个值。例如,该常量将等于self.view.frame.size.height/30。在i
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"
}
我不会将约束直接指定给视图 我想:
- (instancetype)constraintWithItem:(id)视图1 属性:(NSLayoutAttribute)属性1 relatedBy:(NSLayoutRelation)关系 toItem:(id)视图2 属性:(NSLayoutAttribute)属性2 乘法器:(CGFloat)乘法器 常数:(CGFloat)c
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代码吗?回答很好!你让我开心,我很高兴我终于学会了乘法器的功能!