【问题标题】:How To Properly Add Child View Controller in iOS 8 With Swift如何使用 Swift 在 iOS 8 中正确添加子视图控制器
【发布时间】:2014-12-23 08:34:44
【问题描述】:

我一直在阅读文档,但似乎仍然处于症结之中。

我有一个视图控制器对象 C_SelectPhoto。这有一个容器视图。在容器视图中,我希望子视图控制器 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 框架适合我在主视图控制器中的容器?

谢谢!!!

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

【问题讨论】:

    标签: ios swift uiviewcontroller storyboard uicollectionview


    【解决方案1】:

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

    【讨论】:

    • 我注意到 UICollectionView 的大小不符合我为其设置的框架。如果我在 viewDidAppear 中检查它的框架时将它的框架设置为 (0,0,50,50),它会显示为 (0,0,768,960)!如果我使用通用 UIViewController,则不会出现此问题
    • @Aggressor,不要设置任何框架。它应该与没有任何代码的容器大小相同。确保为容器视图提供所需的任何约束,以使其具有所需的大小。
    • 在情节提要的控制器底部,我看到这个“将 segue 嵌入到‘控制器名称’。你知道我可以随时添加吗?我不小心删除了它,我可以'似乎没有重新创建它
    • @Aggressor,您可以控制从容器视图拖动到要嵌入的控制器,就像我在回答中所说的那样。
    • 感谢您,这描述了我现在的感受:youtube.com/watch?v=K4jWvIcL0YU
    【解决方案2】:

    使用以下扩展在视图上添加 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])
    }}
    

    【讨论】:

    • 在对同样的问题(特别是控制控制 UICollectionView 的子视图控制器的大小/位置)感到非常沮丧之后,我偶然发现了这个解决方案。它工作得很好,包括旋转设备时。投票赞成。只需要进行一次小更新:“.Top”、“.Bottom”、“.Left”和“.Right”枚举在某些时候已更改为全部小写:“.top”、“.bottom”、“.right”和“.left”
    • 您可以也应该致电childController.willMoveToParentViewController(self)
    • 2 件事 - 1,addChildViewController(_:) 为您调用 willMove(toParentViewController:) (developer.apple.com/library/content/featuredarticles/…)。 2、如果你要调用willSomething()didSomething(),确保willSomething()方法在didSomething()方法之前。
    【解决方案3】:

    为 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()
    

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 2018-08-23
      • 2020-10-12
      • 1970-01-01
      相关资源
      最近更新 更多