繁体   English   中英

如何使用Swift在iOS 8中正确添加子视图控制器

[英]How To Properly Add Child View Controller in iOS 8 With Swift

我一直在阅读文档,似乎仍然是一个棘手的问题。

我有一个视图控制器对象C_SelectPhoto。 这有一个容器视图。 在容器视图中,我希望childed视图控制器C_SelectPhotoControllerView适合它。 它只是一系列照片。 但是,设置框架和添加子视图控制器不起作用。 如果我移动所需子视图控制器的x值,则不会发生任何影响。

为了弄清楚发生了什么,我用颜色编码了一切。 下面的容器是橙色的。 容器所期望的视图,根据故事板是黄色的。 我实际上想要适应的视图是红色的。

这是故事板:

在此输入图像描述

这是我的C_SelectPhoto的控制器代码

class C_SelectPhoto:Controller
{
    @IBOutlet weak var selectPhotoControllerView: UIView!
    var _collectionViewController:C_SelectPhotoControllerView!

    //TODO PERMISSION IS NEEDED BEFORE FETCHING
    func initController()
    {   
        _collectionViewController = Controller.STORYBOARD.instantiateViewControllerWithIdentifier("selectPhotoControllerView") as C_SelectPhotoControllerView
        displayControllerViewController()
    }

    //show the photo selection
    private func displayControllerViewController()
    {
        addChildViewController(_collectionViewController)
        _collectionViewController.view.frame = CGRectMake(100, 0, 500, 500)
        self.view.addSubview(_collectionViewController.view)
        _collectionViewController.didMoveToParentViewController(self)
    }
}

但结果是产生如下: 在此输入图像描述

首先,不应该添加黄色类,我只想要红色(UICollectionViewController类)。 其次,我可以告诉红色类被添加到错误的位置,因为它的x值根本没有移动它。

所以我的问题是:如何将UIContainerViewController作为子视图添加到主视图控制器C_SelectPhoto中,但是具有UIContainerViewController框架FIT我在主视图控制器中的容器?

谢谢!!!

注意:我尝试添加的视图是UICollectionViewControllers。 当我添加一个UIViewController时,框架工作正常,但正如您在添加UICollectionViewControllers时所看到的那样,框架不起作用,并且它们被添加到随机偏移中并且不尊重我尝试使用框架分配来调整它们的大小。

使用以下Extension在视图上添加childViewController

extension UIViewController {   
func configureChildViewController(childController: UIViewController, onView: UIView?) {
    var holderView = self.view
    if let onView = onView {
        holderView = onView
    }
    addChildViewController(childController)
    holderView.addSubview(childController.view)
    constrainViewEqual(holderView, view: childController.view)
    childController.didMoveToParentViewController(self)
    childController.willMoveToParentViewController(self)
}


func constrainViewEqual(holderView: UIView, view: UIView) {
    view.translatesAutoresizingMaskIntoConstraints = false
    //pin 100 points from the top of the super
    let pinTop = NSLayoutConstraint(item: view, attribute: .Top, relatedBy: .Equal,
        toItem: holderView, attribute: .Top, multiplier: 1.0, constant: 0)
    let pinBottom = NSLayoutConstraint(item: view, attribute: .Bottom, relatedBy: .Equal,
        toItem: holderView, attribute: .Bottom, multiplier: 1.0, constant: 0)
    let pinLeft = NSLayoutConstraint(item: view, attribute: .Left, relatedBy: .Equal,
        toItem: holderView, attribute: .Left, multiplier: 1.0, constant: 0)
    let pinRight = NSLayoutConstraint(item: view, attribute: .Right, relatedBy: .Equal,
        toItem: holderView, attribute: .Right, multiplier: 1.0, constant: 0)

    holderView.addConstraints([pinTop, pinBottom, pinLeft, pinRight])
}}

如果您希望红色控制器是子控制器,请删除黄色控制器,然后从容器控制拖动到红色控制器。 无需在代码中添加它,也不需要进行任何大小调整。 红色控制器将设置为与故事板中的容器相同的大小。

针对Swift 5+进行了更新

视图控制器中只有一行添加子视图控制器。

如果要在任何自定义视图上添加,可以在扩展中使用超级可伸缩方法。

 public extension UIViewController {

    /// Adds child view controller to the parent.
    ///
    /// - Parameter child: Child view controller.
    func add(_ child: UIViewController) {
        addChild(child)
        view.addSubview(child.view)
        child.didMove(toParent: self)
    }

    /// It removes the child view controller from the parent.
    func remove() {
        guard parent != nil else {
            return
        }
        willMove(toParent: nil)
        removeFromParent()
        view.removeFromSuperview()
    }
}

如何使用:

添加:在要添加子视图控制器的视图控制器中。

// let yourChildViewController = Load fro the storyboard or XIB
add(yourChildViewController)

删除:

yourChildViewController.remove()

暂无
暂无

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

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