新 view.frame.y 与 label.frame.y 不匹配
New view.frame.y doesn't match up with label.frame.y
我在屏幕上有一个标签,其高度设置为 300 像素,设置在屏幕底部,我想创建一个完全覆盖它的 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 内,它被限制在顶部布局指南的底部——因此标签的 Y 相对于 Stack 的顶部查看,而不是屏幕顶部。)) 显然有不同的参照系在起作用,但是需要什么才能将所有内容纳入同一参照系?编辑:或者,以另一种方式问,我怎样才能得到标签在屏幕,这样不管嵌入多少个View,我都可以知道把一个新的View放到哪里去正好覆盖它?
IB 中的原始屏幕:
代码结果(新视图是半透明的;注意底部的黄色带):
您可以通过
查看您的标签位置
let theFrame = view.convert(myLabel.frame, from: your_stack_view_here)
你应该把它移到
viewDidAppear
因为
viewWillLayoutSubviews
将在任何时候调用子视图布局。这是第一次 运行 时的想法,您的 "mylabel" 布局位置不正确。
关于你的问题“如何获取标签在屏幕中的"absolute" X和Y坐标”,答案是使用UIView.convert(_:to:),将nil
作为第二个参数。 (这将产生相对于包含 window 原点的坐标,但出于实际目的,可能就是您所说的“屏幕”)。
我在屏幕上有一个标签,其高度设置为 300 像素,设置在屏幕底部,我想创建一个完全覆盖它的 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 内,它被限制在顶部布局指南的底部——因此标签的 Y 相对于 Stack 的顶部查看,而不是屏幕顶部。)) 显然有不同的参照系在起作用,但是需要什么才能将所有内容纳入同一参照系?编辑:或者,以另一种方式问,我怎样才能得到标签在屏幕,这样不管嵌入多少个View,我都可以知道把一个新的View放到哪里去正好覆盖它?
IB 中的原始屏幕:
代码结果(新视图是半透明的;注意底部的黄色带):
您可以通过
查看您的标签位置let theFrame = view.convert(myLabel.frame, from: your_stack_view_here)
你应该把它移到
viewDidAppear
因为
viewWillLayoutSubviews
将在任何时候调用子视图布局。这是第一次 运行 时的想法,您的 "mylabel" 布局位置不正确。
关于你的问题“如何获取标签在屏幕中的"absolute" X和Y坐标”,答案是使用UIView.convert(_:to:),将nil
作为第二个参数。 (这将产生相对于包含 window 原点的坐标,但出于实际目的,可能就是您所说的“屏幕”)。