【发布时间】:2016-10-31 14:48:33
【问题描述】:
我想在UIStackView 中动态添加视图控制器。
UIStackView 必须是可滚动的,所以我将它添加到 UIScrollView 中。
我有一个 UI 错误,内容大小不明确,我尝试使用Debug View Hierarchy 进行调试,结果如下:
UIStackView 中每个控制器的大小为.zero
--
这是我在 StoryBoard 上的层次结构
约束:
-
ScrollView.leading=StackView.leading -
ScrollView.trailing=StackView.trailing -
ScrollView.top=StackView.top -
ScrollView.bottom=StackView.bottom -
ScrollView.width=StackView.width -
ScrollView.height=StackView.height
我的源代码:
class ScrollViewController: UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var stackView: UIStackView!
private var strings = ["echo", "hola", "allo"]
private var containerViews = [ContainerView]()
override func viewDidLoad() {
super.viewDidLoad()
self.setupViews()
}
private func setupViews() {
self.setupContainers()
}
fileprivate func removeContainers() {
for container in containerViews {
container.uninstall()
}
containerViews.removeAll()
}
fileprivate func setupContainers() {
removeContainers()
for string in strings {
let viewController = // get the view Controller from StoryBoard
add(viewController)
}
}
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let viewController = segue.destination
let index = strings.index(of: sender as! String)!
}
fileprivate func add(_ viewController: UIViewController) {
let containerView = ContainerView(parentController: self)
containerView.install(viewController)
stackView.addArrangedSubview(containerView)
}
}
class ContainerView<T:UIViewController>: UIView {
unowned var parentViewController: UIViewController
weak var currentController: T?
init(parentController: UIViewController) {
self.parentViewController = parentController
super.init(frame: CGRect.zero)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func install(_ viewController: T) {
pushViewController(viewController, animated: false)
}
func uninstall() {
if let controller = currentController {
removeViewController(controller)
currentController = nil
}
}
fileprivate func setUpViewController(_ targetViewController: T?, animated: Bool) {
if let viewController = targetViewController {
parentViewController.addChildViewController(viewController)
viewController.view.frame = self.bounds
self.addSubview(viewController.view)
viewController.didMove(toParentViewController: parentViewController)
}
}
fileprivate func removeViewController(_ viewController: T?) {
if let _viewController = currentController {
_viewController.willMove(toParentViewController: nil)
_viewController.view.removeFromSuperview()
_viewController.removeFromParentViewController()
}
}
fileprivate func pushViewController(_ controller: T, animated: Bool) {
removeViewController(currentController)
currentController = controller
setUpViewController(controller, animated: false)
}
}
我无法在UIScrollView 上滚动,因为内容大小设置不正确。有谁知道如何解决这个错误?
编辑:您可以在这里看到带有错误示例的 git: GitHub StackViewOnScrollView
【问题讨论】:
-
我希望子视图的大小与其内在内容一样。在我的情况下,每个控制器上的约束都设置得很好,但是
contentSize在UIScrollView上不正确
标签: ios swift uiscrollview uistackview