如果设置锚点,如何获得视图的高度
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.height
、self.frame.size.height
、self.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以上是关于如果设置锚点,如何获得视图的高度的主要内容,如果未能解决你的问题,请参考以下文章