如果设置锚点,如何获得视图的高度

Posted

技术标签:

【中文标题】如果设置锚点,如何获得视图的高度【英文标题】:How can I get the height of a view if I set its anchors 【发布时间】:2017-10-03 07:27:10 【问题描述】:

我目前正在尝试访问我之前为其设置锚点的视图的高度。例如,我在 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 是我创建的一个类的对象,它继承自 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.heightself.frame.size.heightself.bounds.height 并获得self.heightAnchor 约束的.constant 值,但都返回0。

我认为有一个解决方案来解决这个问题,但我一直无法找到它。

【问题讨论】:

那么 view1.frame.bounds 呢?您确定在重新加载视图时尝试打印框架吗?请输入一些代码以显示您何时尝试获取高度 您应该能够在视图显示几毫秒后得到它: Timer.scheduledTimer(withTimeInterval: 0.01, repeats: false) (nil) in print(self.imageView.frame) 【参考方案1】:

您在定义约束之后查询视图框架的高度,但在布局实际上将这些约束解析为框架矩形之前。一种方法是调用layoutIfNeeded 强制布局立即发生,然后使用view.frame.size.height。 init 方法可能不适合执行此操作,而不是在控制器上的 viewDidLoad 内。或者您可以在 viewDidLayoutSubviews 中执行此操作,以便在每次更新视图布局时重新计算圆角半径(在这种情况下,您不需要 layoutIfNeeded)。

【讨论】:

我试图在按下按钮时执行的函数中访问高度。但是,当我在函数内部调试时,frame.height 仍然是 0。 当您点击按钮时,您的图像视图已经加载并可见并布置在您期望的位置?【参考方案2】:

如果您已经使用了顶部、底部、前导和尾随,请不要使用高度约束。

尝试通过添加背景颜色或使用调试视图层次结构按钮来直观地调试视图。

要获得视图的高度,您应该使用view.frame.size.height

EDIT(OP 问题已编辑)

您的问题是您尝试在对象高度刚刚初始化但尚未显示时访问它。您应该创建一个更新 UI 的函数,并在加载视图后调用它。

【讨论】:

感谢 Damien 的回答,但这不是我想要的。这是我的错,因为我可能对我的问题有点不清楚。我用更多信息和代码更新了我的问题! 我认为您的问题是您试图过早获得高度。我编辑了我的答案 我尝试使用按下按钮时调用的函数来获取高度。但是,它仍然给我 0 作为高度。你知道我该如何解决这个问题吗? 如果高度已由约束设置,则 view.frame.size.height 将为 0

以上是关于如果设置锚点,如何获得视图的高度的主要内容,如果未能解决你的问题,请参考以下文章

集合视图中的自动布局 ImageView 高度锚冲突且无法正常工作

如何使自动布局约束依赖于多个其他锚点?

如何在onCreate方法中获取视图的宽度和高度

如何根据插入的行数设置表格视图的高度

如何在快速屏幕旋转后获得视图的高度?

UIView 高度约束动画,与其他视图有锚连接