2014-10-28 86 views
2

我一直在阅读文档,但似乎仍然处于困境之中。如何在Swift中正确添加iOS 8中的子视图控制器

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

为了弄清楚发生了什么,我对所有的东西都进行了颜色编码。下面的容器是橙色的。根据故事板的容器所期望的视图是黄色的。我实际上想要适应的观点是红色的。

这里是故事板:下面

enter image description here

这里是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) 
    } 
} 

然而结果是产生是: enter image description here

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

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

谢谢!!!

注意:我试图添加的视图是UICollectionViewControllers。当我添加一个UIViewController时,框架工作得很好,但是正如你在添加UICollectionViewControllers时可以看到的那样,框架不起作用,并且它们被添加到随机偏移量,并且不考虑我尝试使用帧分配来设置它们的大小。

回答

3

如果您想让红色控制器成为子控制器,请删除黄色控制器,然后通过控件从容器拖动到红色控制器。无需将其添加到代码中,也不需要调整大小。红色控制器将被设置为与故事板中的容器相同的尺寸。

+0

我注意到UICollectionView大小是不尊重我为它设定的框架。如果我将其框架设置为(0,0,50,50),那么我在viewDidAppear中检查其框架时,它会以(0,0,768,960)出现!如果我使用通用UIViewController,则不会发生此问题 – Aggressor 2014-10-28 03:45:05

+0

@Aggressor,请勿设置任何框架。它应该与没有任何代码的容器大小相同。确保给容器视图提供所需的任何约束,以使其达到所需的大小。 – rdelmar 2014-10-28 03:47:09

+0

在故事板中控制器的底部,我看到了这个“将segue嵌入到'Controller Name'中。你知道如何随时添加我想要的吗?我意外删除了它,我似乎无法重新创建它 – Aggressor 2014-10-28 03:52:22

8

使用下面的扩展添加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]) 
}} 
+0

经历了同样的问题(尤其是控制一个控制UICollectionView的子视图控制器的大小/位置)后,我偶然发现了这个解决方案。它完美运行,包括旋转设备时。上投票。只需要一次小小的更新:“.top”,“.Bottom”,“.Left”和“.Right”列举在某些时候已经改变为全部小写:“.top”,“.bottom”,“。right”和“.left” – 2017-02-22 04:17:20

+1

您可以也应该调用'childController.willMoveToParentViewController(self)' – Joey 2018-01-24 18:53:29

+0

感谢您的更新@Joey – 2018-01-25 05:43:06

相关问题