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

Agg*_*sor 4 storyboard uiviewcontroller ios uicollectionview 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!!!

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

Pha*_*Sai 10

使用以下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])
}}
Run Code Online (Sandbox Code Playgroud)

  • 2件事-1,addChildViewController(_ :)为您调用willMove(toParentViewController :)(https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html)。2,如果您要调用`willSomething()`和`didSomething()`,请确保`willSomething()`方法位于`didSomething()`方法之前。 (2认同)

Bhu*_*att 7

已针对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()
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用:

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

// let yourChildViewController = Load fro the storyboard or XIB
add(yourChildViewController)
Run Code Online (Sandbox Code Playgroud)

移除:

yourChildViewController.remove()
Run Code Online (Sandbox Code Playgroud)


rde*_*mar 5

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