gpt4 book ai didi

swift - 对 superview 的约束不起作用

转载 作者:行者123 更新时间:2023-11-28 11:18:12 29 4
gpt4 key购买 nike

我将 subview 添加到父 View ,我想约束 subview 。但它什么都不做。 subview 在父 View 上全屏添加。请帮助我,出了什么问题?

这是我的代码:

  override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
setupConstraints()
}

func setupConstraints(){
heightConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 80)
bottomConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: view.superview!, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 30)
widthConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: view.superview!, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0)

view.setTranslatesAutoresizingMaskIntoConstraints(false)
view.superview!.setTranslatesAutoresizingMaskIntoConstraints(false)

view.addConstraint(heightConstraint!)
view.addConstraint(widthConstraint!)
view.addConstraint(bottomConstraint!)
}

最佳答案

问题是您的约束不明确(未确定)。没有足够的信息知道将您的 view 放在哪里。

必须知道四个信息:

* x position
* y position
* width
* height

查看您的约束,并考虑每个约束确定的内容:

heightConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 80)

那是高度。

bottomConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: view.superview!, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 30)

这是 y 位置。

widthConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: view.superview!, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0)

那是宽度。

糟糕! x位置呢?

您的代码的另一个问题可能是这一行:

view.superview!.setTranslatesAutoresizingMaskIntoConstraints(false)

您删除了 view.superview 的自动生成的约束,但您没有用任何新约束替换它们。因此,此时它的配置也可能不明确(除非它已经具有我们不知道的一整套约束,但在那种情况下,该行是不必要的)。


在我的书中,我提供了一些实用方法的代码来帮助追踪这种事情:

extension NSLayoutConstraint {
class func reportAmbiguity (var v:UIView?) {
if v == nil {
v = UIApplication.sharedApplication().keyWindow
}
for vv in v!.subviews as! [UIView] {
println("\(vv) \(vv.hasAmbiguousLayout())")
if vv.subviews.count > 0 {
self.reportAmbiguity(vv)
}
}
}
class func listConstraints (var v:UIView?) {
if v == nil {
v = UIApplication.sharedApplication().keyWindow
}
for vv in v!.subviews as! [UIView] {
let arr1 = vv.constraintsAffectingLayoutForAxis(.Horizontal)
let arr2 = vv.constraintsAffectingLayoutForAxis(.Vertical)
NSLog("\n\n%@\nH: %@\nV:%@", vv, arr1, arr2);
if vv.subviews.count > 0 {
self.listConstraints(vv)
}
}
}
}

如果你运行NSLayoutConstraint.reportAmbiguity(view.superview!),最好是在viewDidLayoutSubviews中,在你的view被注入(inject)之后在 View 层次结构中,您会发现 view 报告不明确。这就是您没有看到预期内容的原因。

关于swift - 对 superview 的约束不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30384693/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com