【发布时间】:2019-05-08 09:50:34
【问题描述】:
我花了几个小时在谷歌搜索和调试器中,我无法弄清楚为什么我在这个 xib 中的父视图在运行时会发生变化。
我已经创建了一个简单的 Xib:
在容器中我设置了宽度和高度约束(我尝试在顶部父级中设置约束,但我似乎无法做到):
在运行时,我以编程方式加载 Xib 并将其添加到视图中。但是在我将它添加到视图并设置位置后,父级的框架更小并且位置错误。
在这里,我明确地将 x 设置为 16,将 y 设置为 400。但是,当我在检查器调试工具中查看它时,我得到的结果与我想要的不同,因为父框架已更改并且容器位置错误因此。我将检查器转到一边,这样您就可以看到父容器(蓝色)和子容器(白色)以及父容器如何小于子容器:
父级(根xib视图'Item Detail Size Widget')的详细信息如下。注意高度现在是 32 而不是 76:
顶级子(Container)的详细信息如下:
所以我为容器设置的约束得到遵守,但父级正在调整大小(我假设因为我无法设置约束,它会使用我设置的框架)。
我尝试关闭和打开 translatesAutoResizingMaskIntoConstraints 和其他一些东西,但我似乎无法让父容器的大小与容器完全相同。
对于为什么根项目详细信息大小小部件与容器的大小不匹配并且在运行时发生变化,您有什么建议吗?
更新
这里是我添加小部件的代码供参考:
let sizer: ItemDetailSizeWidget = .fromNib()
sizer.x = 16
sizer.y = 400
contentView.addSubview(sizer)
我有 UIView 扩展设置 x 和 y 如下:
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
}
【问题讨论】:
-
你能告诉我们加载xib并将顶级视图添加到视图层次结构的代码吗?
-
这很琐碎,但我现在会添加它
标签: xcode interface-builder xib nslayoutconstraint iboutlet