繁体   English   中英

获取UIStackView子视图的框架

[英]Get the frame of a UIStackView subViews

我在IB中创建了一个UIStackView,其分布设置为Fill Equally。 我希望得到每个subView的帧,但以下代码总是返回(0,0,0,0)。

class ViewController: UIViewController {
    @IBOutlet weak var stackView: UIStackView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let pView = UIView()
        let sView = UIView()

        pView.backgroundColor = UIColor.red
        sView.backgroundColor = UIColor.orange

        stackView.addArrangedSubview(pView)
        stackView.addArrangedSubview(sView)
    }

    override func viewDidLayoutSubviews() {
        print(stackView.arrangedSubviews[0].frame)
        print(stackView.arrangedSubviews[1].frame)
    }
}

我认为设置为平均填充的堆栈视图会自动设置计算它。

任何帮助,将不胜感激。

阅读完代码后,我认为这只是对viewDidLayoutSubviews()的一种误解。 基本上,当所有作为主视图后代的视图已经布局但是这不包括这些视图的子视图(后代)时,它会被调用。 请参阅Apple的讨论说明

“当视图控制器视图的边界发生变化时,视图会调整其子视图的位置,然后系统会调用此方法。但是,调用此方法并不表示视图的子视图的各个布局已经过调整。每个子视图负责调整自己的布局。“

现在有很多方法可以获得子视图的框架。

首先,您可以在viewdidload中添加一行代码并将其获取。

    override func viewDidLoad() {
    super.viewDidLoad()

    let pView = UIView()
    let sView = UIView()

    pView.backgroundColor = UIColor.red
    sView.backgroundColor = UIColor.orange

    stackView.addArrangedSubview(pView)
    stackView.addArrangedSubview(sView)
    stackView.layoutIfNeeded()
    print(stackView.arrangedSubviews[0].frame)
    print(stackView.arrangedSubviews[1].frame)

}

或者你可以等到viewDidAppear并检查那里。

 override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    print(stackView.arrangedSubviews[0].frame)
    print(stackView.arrangedSubviews[1].frame)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM