我有父视图控制器和子视图控制器。我使用按钮来显示子视图控制器。在显示子视图之前,我需要输入 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")
}
}
}
我们可以告诉子控制器的视图使用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 布局约束将决定其宽度和高度。