6
votes

Comment ajouter correctement le contrôleur de vue enfant dans iOS 8 avec Swift

Je traverse la documentation et je semble toujours être sur un point de collage.

J'ai un objet de contrôleur d'affichage c_selectphoto. Cela a une vue sur le conteneur. À l'intérieur de la vue du conteneur, je souhaite le contrôleur d'affichage de l'enfant, c_selectphotocontrolview, pour s'adapter à l'intérieur. Ce sera juste un éventail de photos. Cependant, régler le cadre et ajouter le contrôleur de vue enfant ne fonctionne pas. Si je déplace la valeur X du contrôleur d'affichage enfant souhaité, aucun effet ne se produit.

Pour comprendre ce qui se passe sur i couleur codé tout. Le conteneur, en dessous, est orange. La vue Le conteneur s'attend à ce que le storyboard soit jaune. La vue que je veux réellement aller là-bas est rouge.

Voici le storyboard:

 Entrez la description de l'image ici

voici mon code de contrôleur pour c_selectphoto xxx

Toutefois, le résultat produit est ci-dessous: Entrez la description de l'image ici

Premièrement, la classe jaune ne doit pas être ajoutée du tout, Je ne voulais que le rouge (la classe Uicollectionviewcontroller). Deuxièmement, je peux dire que la classe rouge est en train d'être ajoutée au mauvais endroit car sa valeur x n'a pas été déplacée du tout.

Donc, ma question est la suivante: Comment puis-je ajouter un UIContagerViewController, en tant qu'enfant au contrôleur d'affichage principal, c_selectphoto, mais que le cadre UicontagerViewController est adapté au conteneur que j'ai dans le contrôleur d'affichage principal?

Merci !!!

Remarque: Les vues que j'essayent d'ajouter sont UicollectionViewControlers. Lorsque j'ajoute un UIViewController, le cadrage fonctionne tout simplement bien, mais comme vous pouvez le constater lors de l'ajout de l'uicollectionviewControlers, le cadrage ne fonctionne pas, et ils sont ajoutés à des compensations aléatoires et ne respectant pas mes tentatives de taille avec des assignations de trame. < / p>


0 commentaires

3 Réponses :


5
votes

Si vous voulez que le contrôleur rouge soit le contrôleur enfant, supprimez le jaune et faites-la glisser-glisser du conteneur vers le contrôleur rouge. Il n'est pas nécessaire de l'ajouter en code ou de redimensionner. Le contrôleur rouge sera réglé sur la même taille que le conteneur dans le storyboard.


6 commentaires

Je remarque que la taille Uicollectionview ne respecte pas le cadre que je suis défini. Si je fixais son cadre sur (0,0 50h50) lorsque je vérifie son cadre dans la vue ViewDidAppear, sa sortez comme (0,0 768,960)! Si j'utilise un UIViewController générique, ce problème ne se produit pas


@Aggressor, ne pose aucun cadre. Il devrait avoir la même taille que le conteneur sans aucun code. Assurez-vous de donner la vue du conteneur quelles que soient les contraintes nécessaires pour lui donner la taille souhaitée.


Au bas du contrôleur dans le storyboard, je vois que "Intégrer la Segue à" nom du contrôleur ". Savez-vous comment je peux ajouter ces temps que je veux? Je l'ai supprimé par accident et je n'arrive pas à le créer de le recréer


@Aggressor, vous contrôlez Faites glisser de la vue du conteneur sur le contrôleur que vous souhaitez intégrer, comme je l'ai dit dans ma réponse.


Cela décrit comment je me sens en ce moment grâce à vous: YouTube.com/watch?v=k4jwvicl0yu


Stackoverflow.com/Questtions/25404484/...



12
votes

Utilisez l'extension suivante pour l'ajout d'enfantViewController à la vue

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])
}}


3 commentaires

Après beaucoup de frustration avec le même problème (contrôlant spécifiquement la taille / l'emplacement d'un contrôleur de vue enfant contrôlant une uicollectionview) je suis tombé sur cette solution. Cela a parfaitement fonctionné, y compris lors de la rotation du périphérique. Up voté. Une seule mise à jour mineure requise: ".top", ".bottom", ".left" et ".right" et ".right" ont changé à un moment donné à tous les minuscules: ".top", ".bottom", ". et gauche"


Vous pouvez et devez également appeler enfilcontroller.willmoveToparentViewController (auto)


2 choses - 1, addchildvievoller (_:) appels willmove (ToparentViewController :) pour vous ( développeur.apple.com/library/content/careréArticles/... ). 2, si vous allez appeler Willsomething () et Didsomethile () , assurez-vous que la méthode Willsomething () est une méthode () méthode.



11
votes

mis à jour pour Swift 5 + P>

Une seule ligne dans votre contrôleur d'affichage pour ajouter un contrôleur de vue enfant. p>

méthodes super évolutives dans l'extension si vous souhaitez l'ajouter sur une vue personnalisée. p> xxx pré>

Comment utiliser: strong> P>

Ajout: strong> dans le contrôleur d'affichage où vous souhaitez ajouter le contrôleur de la vue enfant. P>

yourChildViewController.remove()


0 commentaires