我想将
ViewController
添加到另一个 ViewController
中。我使用这个代码:
class CustomPageViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let childViewController = UIStoryboard(name: "Storyboard", bundle: nil).instantiateViewController(withIdentifier: "ContentViewController")
self.addChildViewController(childViewController)
self.view.addSubview(childViewController.view)
childViewController.didMove(toParentViewController: self)
childViewController.view.frame = self.view.frame
}
}
class ContentViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
}
}
但结果我只有灰屏。在我的
ContentViewController
中,我使用红色作为背景视图颜色,并且我有标签
更新:
灰色背景是图像的背景。问题是我的内容没有加载到控制器中。
母VC
private struct PagesData: Decodable {
var pagesData: [PageData]
}
private struct PageData: Decodable {
let textData, textPosition: String
}
class CustomPageViewController: UIViewController {
private var pagesContent: [ContentViewController] = []
private var pagesData = [PageData]()
let contentViewController = ContentViewController()
var pageNumber = 0
override func viewDidLoad() {
super.viewDidLoad()
let childViewController = UIStoryboard(name: "Storyboard", bundle: nil).instantiateViewController(withIdentifier: "ContentViewController")
self.addChildViewController(childViewController)
self.view.addSubview(childViewController.view)
childViewController.didMove(toParentViewController: self)
childViewController.view.frame = self.view.frame
loadData()
}
func loadData() {
let url = Bundle.main.url(forResource: "pages", withExtension: "json")!
let data = try! Data(contentsOf: url)
let result = try! JSONDecoder().decode(PagesData.self, from: data)
for page in result.pagesData {
let contentVC = ContentViewController()
contentVC.configure(text: page.textData,
image: "image\(pagesContent.count).png",
position: page.textPosition)
pagesContent.append(contentVC)
}
}
}
儿童VC
import UIKit
class ContentViewController: UIViewController {
var textPosition = "bottomLeft"
private lazy var textLabel: UILabel = {
let label = UILabel()
label.textAlignment = .left
label.numberOfLines = 0
label.textColor = .white
label.sizeToFit()
label.font = UIFont.systemFont(ofSize: 25, weight: .bold)
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
private lazy var imageView: UIImageView = {
let image = UIImageView()
image.contentMode = .scaleToFill
image.translatesAutoresizingMaskIntoConstraints = false
image.backgroundColor = .gray
return image
}()
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
setupConstraints()
}
private func setupViews() {
view.addSubview(imageView)
view.addSubview(textLabel)
}
private func setupConstraints() {
imageView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0).isActive = true
imageView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0).isActive = true
imageView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 0).isActive = true
imageView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: 0).isActive = true
switch textPosition {
case "topCenter":
textLabel.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor,
constant: 16).isActive = true
textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
constant: 16).isActive = true
textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
constant: -16).isActive = true
case "centerCenter":
textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
constant: 16).isActive = true
textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
constant: -16).isActive = true
textLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
textLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
case "bottomCenter":
textLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,
constant: -16).isActive = true
textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
constant: 16).isActive = true
textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
constant: -16).isActive = true
case "topLeft":
textLabel.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor,
constant: 16).isActive = true
textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
constant: 16).isActive = true
textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
constant: -16 - (view.frame.size.width/2)).isActive = true
case "centerLeft":
textLabel.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor,
constant: 16).isActive = true
textLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,
constant: -16).isActive = true
textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
constant: 16).isActive = true
textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
constant: -16 - (view.frame.size.width/2)).isActive = true
case "bottomLeft":
textLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,
constant: -16).isActive = true
textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
constant: 16).isActive = true
textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
constant: -16 - (view.frame.size.width/2)).isActive = true
case "topRight":
imageView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor,
constant: 0).isActive = true
imageView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
constant: 0).isActive = true
imageView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
constant: 0).isActive = true
case "centerRight":
textLabel.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor,
constant: 16).isActive = true
textLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,
constant: -16).isActive = true
textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
constant: 16 + (view.frame.size.width/2)).isActive = true
textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
constant: -16).isActive = true
case "bottomRight":
textLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,
constant: -16).isActive = true
textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
constant: 16 + (view.frame.size.width/2)).isActive = true
textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
constant: -16).isActive = true
default:
textLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,
constant: -16).isActive = true
textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
constant: 16).isActive = true
textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
constant: -16).isActive = true
}
}
func configure(text: String, image: String, position: String) {
textLabel.text = text
imageView.image = UIImage(named: image)
textPosition = position
print(text)
}
}
您错过了
frame
的 childViewController.view
及其父视图:
childViewController.view.frame = self.view.frame