如果设置锚点,如何获得视图的高度
How can I get the height of a view if I set its anchors
我目前正在尝试访问我之前设置锚点的视图的高度。因此,例如,我在 ViewController 中使用以下设置 searchTable
的左、右、上和下锚点:
searchTable.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
searchTable.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
searchTable.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
searchTable.bottomAnchor.constraint(equalTo: menuBar.topAnchor).isActive = true
searchTable
是我创建的 class 的对象,它继承自 UIView 并在其中包含一个 UIImageView。我通过在 init 函数中使用以下内容来约束 UIImageView:
imageView.topAnchor.constraint(equalTo: topContainer.topAnchor, constant: 10).isActive = true
imageView.leftAnchor.constraint(equalTo: topContainer.leftAnchor, constant: 10).isActive = true
imageView.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: topContainerMultiplier * imageProfileMultiplier).isActive = true
imageView.widthAnchor.constraint(equalTo: self.heightAnchor, multiplier: topContainerMultiplier * imageProfileMultiplier).isActive = true
其中:
let topContainerMultipler: Double = 1 / 7
let imageProfileMultipler: Double = 1 / 5
在searchTable
的初始化函数中,我尝试将角半径设置为图像大小的一半。我尝试使用 self.frame.height
、self.frame.size.height
、self.bounds.height
并且还获取了 self.heightAnchor
约束的 .constant
值,但所有 returns 0。
我认为有一个解决方案可以解决这个问题,但我没能找到它。
如果您已经使用了顶部、底部、前导和尾随,请不要使用高度限制。
尝试通过添加背景色或使用调试视图层次结构按钮直观地调试您的视图。
要获取视图的高度,您应该使用 view.frame.size.height
编辑(OP 问题已编辑)
您的问题是您试图在刚刚初始化但尚未显示时访问对象高度。您应该创建一个函数来更新 UI 并在加载视图后调用它。
您在定义约束后查询视图框架的高度,但在布局实际将这些约束解析为框架矩形之前。一种方法是调用 layoutIfNeeded
强制布局立即发生,然后使用 view.frame.size.height
。 init 方法可能不是执行此操作的合适位置,而不是在控制器的 viewDidLoad
内部。或者您可以在 viewDidLayoutSubviews
中执行此操作以在每次更新视图布局时重新计算角半径(在这种情况下您不需要 layoutIfNeeded
)。
我目前正在尝试访问我之前设置锚点的视图的高度。因此,例如,我在 ViewController 中使用以下设置 searchTable
的左、右、上和下锚点:
searchTable.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
searchTable.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
searchTable.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
searchTable.bottomAnchor.constraint(equalTo: menuBar.topAnchor).isActive = true
searchTable
是我创建的 class 的对象,它继承自 UIView 并在其中包含一个 UIImageView。我通过在 init 函数中使用以下内容来约束 UIImageView:
imageView.topAnchor.constraint(equalTo: topContainer.topAnchor, constant: 10).isActive = true
imageView.leftAnchor.constraint(equalTo: topContainer.leftAnchor, constant: 10).isActive = true
imageView.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: topContainerMultiplier * imageProfileMultiplier).isActive = true
imageView.widthAnchor.constraint(equalTo: self.heightAnchor, multiplier: topContainerMultiplier * imageProfileMultiplier).isActive = true
其中:
let topContainerMultipler: Double = 1 / 7
let imageProfileMultipler: Double = 1 / 5
在searchTable
的初始化函数中,我尝试将角半径设置为图像大小的一半。我尝试使用 self.frame.height
、self.frame.size.height
、self.bounds.height
并且还获取了 self.heightAnchor
约束的 .constant
值,但所有 returns 0。
我认为有一个解决方案可以解决这个问题,但我没能找到它。
如果您已经使用了顶部、底部、前导和尾随,请不要使用高度限制。
尝试通过添加背景色或使用调试视图层次结构按钮直观地调试您的视图。
要获取视图的高度,您应该使用 view.frame.size.height
编辑(OP 问题已编辑)
您的问题是您试图在刚刚初始化但尚未显示时访问对象高度。您应该创建一个函数来更新 UI 并在加载视图后调用它。
您在定义约束后查询视图框架的高度,但在布局实际将这些约束解析为框架矩形之前。一种方法是调用 layoutIfNeeded
强制布局立即发生,然后使用 view.frame.size.height
。 init 方法可能不是执行此操作的合适位置,而不是在控制器的 viewDidLoad
内部。或者您可以在 viewDidLayoutSubviews
中执行此操作以在每次更新视图布局时重新计算角半径(在这种情况下您不需要 layoutIfNeeded
)。