新view.frame.y与label.frame.y不匹配

时间:2017-03-08 15:45:16

标签: ios graphics frame

我在屏幕上有一个标签,其高度设置为300px,设置在屏幕的底部,我想创建一个完全覆盖它的UIView。我使用的代码是

let theFrame = CGRect(x: myLabel.frame.minX, y: myLabel.frame.minY, width: myLabel.frame.width, height: myLabel.frame.height)

newVu = UIView(frame: theFrame)
let newColor = UIColor(colorLiteralRed: 0.5, green: 0.5, blue: 1, alpha: 0.5)
newVu.backgroundColor = newColor
self.view.addSubview(newVu)

我得到的结果是新的UIView比标签高出约20个点。 ((编辑:正如GeorgeGreen帮我在评论中看到的那样,这是因为标签位于Vertical StackView中,它被限制在Top Layout Guide的底部 - 因此标签的Y相对于Stack的顶部查看,而不是屏幕的顶部。))显然,工作中有不同的参考框架,但是将所有内容放在同一参考框架中需要什么?编辑:或者,换一种方式,如何在屏幕 中获得标签 的“绝对”X和Y坐标,以便无论它嵌入了多少视图,我都知道在哪里放置一个新视图以完全覆盖它?

IB中的原始屏幕:

original screen in IB

代码的结果(新视图是半透明的;请注意底部的黄色条带):

result of the code -- note yellow band at the bottom

2 个答案:

答案 0 :(得分:1)

您可以通过

获取标签位置
let theFrame = view.convert(myLabel.frame, from: your_stack_view_here)

你应该把它移到

viewDidAppear

因为

viewWillLayoutSubviews

会随时调用子视图的布局。这是第一次运行的时候,你的" mylabel"没有正确的位置布局。

Apple document

答案 1 :(得分:0)

关于“如何在屏幕上获得”标签的绝对“X和Y坐标”的问题,答案是使用UIView.convert(_:to:),将nil作为第二个参数。 (这将产生相对于包含窗口原点的坐标,但出于实际目的,可能就是“屏幕”的含义。)