程序化UIView,子视图无法呈现正确的位置

时间:2017-01-07 23:22:32

标签: ios swift

我试图渲染一个包含子视图的视图。但是,子视图呈现在错误的y位置。

ViewController是父视图。

ViewController2ViewController的子视图,并且拥有自己的子视图(让我们称之为X)。即使XViewController2的框架具有相同的y值,X也会在不正确的y位置呈现。

修改: 我应该注意,X应该出现在ViewController2中的相同位置。或者至少,这是意图。

见下面的代码:

ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {

        var y: CGFloat = 10

        for vc in getVcs() {
            self.view.addSubview(vc.render(x: 10, y: y))
            y += 75
        }

        super.viewDidLoad()
    }

    func getVcs() -> [ViewController2] {
        return [
           ViewController2(),
           ViewController2(),
           ViewController2()
        ]
    }
}

ViewController2.swift

import UIKit

class ViewController2: UIViewController {

    func render(x: CGFloat, y: CGFloat) -> UIView {
        let viewFrame = CGRect(x: x, y: y, width: 300, height: 50)
        let xview = UIView(frame: viewFrame)

        let subViewFrame = CGRect(x: x, y: y, width: 200, height: 25) // X
        let subView = UIView(frame: subViewFrame)
        subView.layer.borderColor = UIColor.green.cgColor
        subView.layer.borderWidth = 1
        xview.addSubview(subView)

        xview.layer.borderColor = UIColor.red.cgColor
        xview.layer.borderWidth = 1
        return xview
    }

}

它们在运行时的显示方式:

(绿色边框代表X,红色边框代表ViewController2。)

enter image description here

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

框架在 SUPERVIEW' S COORDINATES 中指定。您的边界位于当前视图的坐标中。因此,ViewController2的框架需要表示为相对于ViewController的框架,而不是相对于窗口。

答案 1 :(得分:1)

视图定义了与其父视图相关的自己的框架。

在ViewController2中,基于y参数实例化的子视图将相对于其父视图(红色框)添加。

解决方案是在子视图框架上相对于父框架更改y值

let subViewFrame = CGRect(x: x, y: y, width: 200, height: 25) // X

另外,为了清楚了解发生了什么,请尝试在ViewController2()中添加另一个getVCs(,它将如下所示。

正如您所看到的,您的代码不会错误地放置第二个视图,就像从屏幕截图看起来一样。它将绿色框相对于其父框架进一步和进一步放置。第三帧只是一个幸运的打击。希望这有助于=)

enter image description here