我已经花了几个小时在调试器中进行了谷歌搜索,但我无法弄清为什么该XIB中的父视图在运行时会发生变化。
我创建了一个简单的Xib:
在容器中,我设置了宽度和高度约束(我尝试在顶级父对象中设置约束,但似乎无法做到):
在运行时,我以编程方式加载Xib,并将其添加到视图中。 但是,在将其添加到视图并设置位置之后,父级的框架会变小并且位置错误。
在这里,我明确地将x设置为16,将y设置为400。但是,当我在检查器调试工具中查看它时,得到的结果与我想要的结果不同,因为父框架已更改,并且Container位置错误。 我将检查器转到一边,这样您就可以看到父级(蓝色)和子级容器(白色)以及父级比子级小:
父项的详细信息(根xib视图“ Item Detail Size Widget”)。 注意,现在的高度是32而不是76:
顶级子级(容器)的详细信息如下:
因此,我为容器设置的约束得以兑现,但父级正在调整大小(我假设因为无法设置约束,所以它将使用我设置的框架)。
我尝试关闭然后打开translatesAutoResizingMaskIntoConstraints和其他一些东西,但是我似乎无法使父级与容器完全一样。
关于根项详细信息大小小部件为何与容器的大小不匹配并且在运行时发生变化,您是否有任何建议?
更新
供参考,以下是添加小部件的代码:
let sizer: ItemDetailSizeWidget = .fromNib()
sizer.x = 16
sizer.y = 400
contentView.addSubview(sizer)
我有设置x和y的UIView扩展,如下所示:
var x: CGFloat {
set { self.frame = CGRect(x: newValue,
y: self.y,
width: self.width,
height: self.height)
}
get { return self.frame.origin.x }
}
var y: CGFloat {
set { self.frame = CGRect(x: self.x,
y: newValue,
width: self.width,
height: self.height)
}
get { return self.frame.origin.y }
}
这是fromNib扩展名
class func fromNib<T: UIView>() -> T {
return Bundle.main.loadNibNamed(String(describing: T.self), owner: nil, options: nil)![0] as! T
}
Xcode始终将自动调整大小蒙版用于xib中的顶级视图。 您可以看到您的第一个屏幕截图:它显示了自动调整大小控件。
顶层视图的autoresizingMask
设置为灵活的宽度和高度。
您没有在顶级视图和“容器”子视图之间设置任何宽度或高度限制。
您还具有以下代码:
contentView.addSubview(sizer)
我怀疑(因为提到过contentView
),您正在将sizer
添加到表视图单元格或集合视图单元格的视图层次结构中。 首次创建单元时,它可能尚未达到最终大小。 从collectionView:cellForRowAtIndexPath:
返回单元格后,集合视图(或表视图)可能会调整单元格的大小。
由于您的sizer
视图具有translatesAutoresizingMaskIntoConstraints
设置为true,当它从笔尖加载,因为它的autoresizingMask
是[.flexibleWidth, .flexibleHeight]
这意味着它会增加或当它的父增大或缩小缩小。
要修复,请尝试以下步骤: