使用您提供的对象名称,这里是一个示例,创建了第二个视图,也是一个UIButton(subViewOfInnerUIView),它将具有与第一个按钮(drawButton)相同的框架。两个按钮都是主视图中不同父视图的子视图。我使用了UIButton,因此可以为视图添加标签,但任何其他可设置框架的UIView子类也可以工作。
请注意,由于它们具有相同的框架,除了大小相同之外,它们相对于其父视图的位置也相同。
即使所涉及的对象驻留在几层深或浅的子视图中,这也应该有效。这不应该成问题。
该示例可以在最新版本的XCode中的单个视图playground中重新创建。希望这可以帮助!
import UIKit
import PlaygroundSupport
class MyViewController : UIViewController {
override func loadView() {
let view = UIView()
view.backgroundColor = .white
self.view = view
let subView1 = UIView(frame: CGRect(x: 40, y: 250, width: 300, height: 300))
subView1.backgroundColor = .red
view.addSubview(subView1)
let subView2 = UIView(frame: CGRect(x: 20, y: 50, width: 340, height: 100))
subView2.backgroundColor = .green
view.addSubview(subView2)
let drawButton = UIButton(frame: CGRect(x: subView1.frame.width / 2 - 50, y: 25, width: 150, height: 50))
drawButton.backgroundColor = .blue
drawButton.setTitle("DRAW BTN", for: .normal)
subView1.addSubview(drawButton)
let subViewOfInnerUIView = UIButton()
subViewOfInnerUIView.setTitle("DRAW BTN2", for: .normal)
subViewOfInnerUIView.backgroundColor = .brown
subView2.addSubview(subViewOfInnerUIView)
let frame = view.convert(drawButton.frame, to: nil)
subViewOfInnerUIView.frame = frame
}
}
PlaygroundPage.current.liveView = MyViewController()
以下是制作两个视图重叠的更新代码。我对变化进行了动画处理,以便清晰可见,并且注释了特定帧以尝试解释如何完成:
import UIKit
import PlaygroundSupport
class MyViewController : UIViewController {
override func loadView() {
let view = UIView()
view.backgroundColor = .white
self.view = view
let subView1 = UIView(frame: CGRect(x: 40, y: 250, width: 300, height: 300))
subView1.backgroundColor = .red
view.addSubview(subView1)
let subView2 = UIView(frame: CGRect(x: 20, y: 50, width: 340, height: 100))
subView2.backgroundColor = .green
view.addSubview(subView2)
let drawButton = UIButton(frame: CGRect(x: subView1.frame.width / 2 - 50, y: 25, width: 150, height: 50))
drawButton.backgroundColor = .blue
drawButton.setTitle("DRAW BTN", for: .normal)
subView1.addSubview(drawButton)
let subViewOfInnerUIView = UIButton()
subViewOfInnerUIView.setTitle("DRAW BTN2", for: .normal)
subViewOfInnerUIView.backgroundColor = .brown
subView2.addSubview(subViewOfInnerUIView)
let frame1 = drawButton.frame
let frame2 = subView1.convert(drawButton.frame, to: view)
let frame3 = view.convert(frame2, to: subView2)
print(frame1)
print(frame2)
print(frame3)
subViewOfInnerUIView.frame = view.convert(drawButton.frame, to: nil)
UIView.animate(withDuration: 5.0, delay: 0.0, options: [.autoreverse, .repeat], animations: {
subViewOfInnerUIView.frame = frame3
}, completion: nil)
subViewOfInnerUIView.frame = frame3
}
}
PlaygroundPage.current.liveView = MyViewController()
最后一行将subViewOfInnerUIView.frame设置为frame3,基本上就是你想要的。你可以创建一个函数来完成这3行代码的工作,以使它更容易(将2个子视图作为参数传递),尽管如果视图层次结构很深,则可能不那么简单:
let frame2 = subView1.convert(drawButton.frame, to: view)
let frame3 = view.convert(frame2, to: subView2)
subViewOfInnerUIView.frame = view.convert(drawButton.frame, to: nil)
希望这能帮到你!