Ios 新视图.frame.y与label.frame.y不匹配

Ios 新视图.frame.y与label.frame.y不匹配,ios,graphics,frame,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(colorLit

我在屏幕上有一个标签,它的高度设置为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在评论中帮助我看到的,这是因为标签位于垂直堆栈视图中,该视图被约束到顶部布局指南的底部-因此标签的Y相对于堆栈视图的顶部,而不是屏幕的顶部。显然,工作中存在着不同的参照系,但需要什么才能将一切纳入同一参照系?编辑:或者,用另一种方式问,我如何获得屏幕上标签的绝对X和Y坐标,这样无论它嵌入了多少视图,我都可以知道在哪里放置新视图以完全覆盖它

IB中的原始屏幕:

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


您可以通过以下方式查看标签位置:

let theFrame = view.convert(myLabel.frame, from: your_stack_view_here)
你应该把它移到

viewDidAppear
因为

viewWillLayoutSubviews
将在子视图显示布局时随时调用。在第一次运行时,您的mylabel布局不正确


关于您的问题“如何获得屏幕中标签的绝对X和Y坐标”,答案是使用nil作为第二个参数。这将产生相对于包含窗口原点的坐标,但出于实际目的,可能就是您所说的“屏幕”。

您在哪里添加了这些代码?@LuanTran此代码从ViewWillLayoutSubview调用,以便在视图首次出现时触发,然后从viewWillTransition开始,当方向从纵向到横向再向后移动时,它会重置大小。后者实际上是更新newView.frame,而不是创建新视图,但黄带在所有情况下都存在。您是否可以尝试将代码移动到viewDidLayoutSubviews,以便系统完成任何可能需要的自动插入?另外,我假设myLabel是self.view的直接子视图?出于兴趣,为什么不简单地为帧集设置newVu=UIViewframe:myLabel.frame,尽管这并没有引起您的问题?@GeorgeGreen这样做了,将其放入viewdilayoutsubview中,并且行为没有改变。至于为什么不使用frame:myLabel.frame,我只是没有想到。标签本身位于视图中的堆栈视图中,并且堆栈视图中的堆栈视图。顶部约束=顶部布局指南。底部。啊!!这就是20px的来源!问题仍然存在,有没有一种方法可以获取标签的绝对x和y?或者最好只是将新视图添加到堆栈视图中?啊哈,@LuanTran的回答应该能帮你解决问题。虽然我同意viewWillLayoutSubviews早于我可以/应该调用它,稍后调用它,如在view**Did**LayoutSubviews@George Green的建议中或在viewdidappease中调用,不会改变新视图被错误放置时得到的结果。我做到了-问题是标签位于垂直堆栈视图中,因此无论何时调用该代码,它都会产生相同的结果。如果标签不在垂直堆栈视图中,其顶部是顶部LayoutGuide的底部,那么即使您之前像我一样调用它,事情对您来说也会正常进行。请看图片正上方问题中的编辑。我明白了。您的Verticel堆栈视图的帧原点y为20。基本视图=>垂直堆栈视图=>LabelYep,这就是我需要的。。。view.convert回答了这个问题,并将标签的坐标拉到我需要的绝对X和Y。谢谢你的帮助!