Swift:子视图控制器内容大小

问题描述 投票:0回答:1

我有父视图控制器和子视图控制器。我使用按钮来显示子视图控制器。在显示子视图之前,我需要输入 x、y 位置并输入子视图的宽度和大小。我想在父视图控制器中输入x,y位置并从子视图控制器获取真实的宽度和高度尺寸。怎么办?

我尝试这样做

child.view.translatesAutoresizingMaskIntoConstraints = false

我可以使用这条线获得真实的子尺寸,但在这种情况下我的 x 和 y 位置 = 0 并且我无法修复它。

家长:

func action() {
     let child = ChildVC()
     addChildViewController(child)
     view.addSubview(child.view)
     child.didMove(toParentViewController: self)
        
     child.view.frame = CGRect(
          x: button.frame.origin.x,
          y: button.frame.origin.y,
          width: ?,
          height: ? )
}

孩子:

var titleLabel: UILabel = {
    let label = UILabel()
    label.text = "title"
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

var imageView: UIImageView = {
    let imageView = UIImageView()
    imageView.image = UIImage(named: "iOS2")
    imageView.translatesAutoresizingMaskIntoConstraints = false
    return imageView
}()

let backgroundView: UIView = {
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

private lazy var menu: UIStackView = {
    let stackView = UIStackView()
    stackView.axis = .vertical
    stackView.spacing = 0
    stackView.distribution = .fillProportionally
    stackView.translatesAutoresizingMaskIntoConstraints = false
    return stackView
}()

private lazy var section: UIStackView = {
    let stackView = UIStackView()
    stackView.axis = .vertical
    stackView.spacing = 16
    stackView.alignment = .center
    stackView.distribution = .fillProportionally
    stackView.translatesAutoresizingMaskIntoConstraints = false
    return stackView
}()

private lazy var cell: UIStackView = {
    let stackView = UIStackView()
    stackView.axis = .horizontal
    stackView.spacing = 16
    stackView.alignment = .fill
    stackView.distribution = .equalSpacing
    stackView.translatesAutoresizingMaskIntoConstraints = false
    return stackView
}()

let sectionNumber = 3

override func viewDidLoad() {
    super.viewDidLoad()

    setupView()
    setupConstraints()
    setupMenu()
}

func setupView() {
    view.addSubview(backgroundView)
    view.addSubview(menu)
}

func setupConstraints() {
    
    backgroundView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0.0).isActive = true
    backgroundView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0.0).isActive = true
    backgroundView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0.0).isActive = true
    backgroundView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0.0).isActive = true
    
    menu.topAnchor.constraint(equalTo: backgroundView.topAnchor, constant: 0.0).isActive = true
    menu.bottomAnchor.constraint(equalTo: backgroundView.bottomAnchor, constant: 0.0).isActive = true
    menu.leadingAnchor.constraint(equalTo: backgroundView.leadingAnchor, constant: 0.0).isActive = true
    menu.trailingAnchor.constraint(equalTo: backgroundView.trailingAnchor, constant: 0.0).isActive = true
}

func setupMenu() {
    
    for index in 0...sectionNumber {
        
        section = UIStackView()
        section.tag = index
        menu.addArrangedSubview(section)
        
        cell = UIStackView()
        cell.tag = index
        section.addArrangedSubview(cell)
        
        titleLabel = UILabel()
        imageView = UIImageView()
        
        cell.addArrangedSubview(titleLabel)
        cell.addArrangedSubview(imageView)
        cell.addSubview(button)
        
        if cell.tag == 0 {
            titleLabel.text = "text text text text"
            imageView.image = UIImage(named: "iOS2")
        } else if cell.tag == 1 {
            titleLabel.text = "text text text"
            imageView.image = UIImage(named: "iOS3")
        } else if cell.tag == 2 {
            titleLabel.text = "text"
            imageView.image = UIImage(named: "iOS1")
        }else {
            titleLabel.text = "text text"
            imageView.image = UIImage(named: "iOS2")
        }
    }
    
}
ios swift
1个回答
0
投票

我们可以告诉子控制器的视图使用autolayout...

您发布的

action()
功能:

func action() {
     let child = ChildVC()
     addChildViewController(child)
     view.addSubview(child.view)
     child.didMove(toParentViewController: self)
        
     child.view.frame = CGRect(
          x: button.frame.origin.x,
          y: button.frame.origin.y,
          width: ?,
          height: ? )
}

并不指示

button
的设置位置,但我们假设您已经这样做了。

将函数更改为:

func action() {
    
    let child = SomeChildVC()
    addChild(child)
    
    // unwrap optional .view
    guard let childView = child.view else { fatalError("Child VC has no view!!!") }
    view.addSubview(childView)
    child.didMove(toParent: self)
    
    childView.translatesAutoresizingMaskIntoConstraints = false
    childView.topAnchor.constraint(equalTo: button.topAnchor).isActive = true
    childView.leadingAnchor.constraint(equalTo: button.leadingAnchor).isActive = true
    
}

现在,子控制器的

.view
将放置在
button
的左上角,并且 its 布局约束将决定其宽度和高度。

© www.soinside.com 2019 - 2024. All rights reserved.