Comment faire pour que view remplisse superview

colas_colas_ Membre
mars 2015 modifié dans API UIKit #1

Hello !


 


J'ai deux VC : 


 


" MainVC. Dans son xib, il y a un custom view, disons qu'elle pointe vers l'IBOutlet customView


" SubVC


 


Voilà  ce que je fais dans le code de MainVC :



- (void)viewDidLoad
{
[super viewDidLoad] ;

SubVC * subVC = [SubVC new] ; // admettons qu'il soit retain qqpart
[self.customView addSubview:subVC.view] ;
}

J'aimerais que la vue de SubVC s'adapte automatiquement à  la taille de customView.


 


Y a-t-il un moyen simple de faire ça ?


 


Merci !


Réponses

  • AliGatorAliGator Membre, Modérateur
    mars 2015 modifié #2
        SubVC * subVC = [SubVC new] ; // admettons qu'il soit retain qqpart
    [self.customView addSubview:subVC.view] ;

    // Use Autolayout to ensure that subVC.view's frame is always locked on the customView's bounds at all times
    NSDictionary* views = @{@subView: subVC.view};
    // - contraintes horizontales (marge à  gauche et à  droite nulles entre la customView et subView)
    [self.customView addLayoutConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@H:|[subView]|
    options:0 metrics:nil views:views]] ;
    // - contraintes verticales (marge en haut et en bas nulles entre la customView et subView)
    [self.customView addLayoutConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@V:|[subView]|
    options:0 metrics:nil views:views]] ;

    (Tapé de mémoire, il peut y avoir une coquille dans les signatures des méthodes)
  • Joanna CarterJoanna Carter Membre, Modérateur

    En plus, il faut gérer les viewControllers (parent/enfant)


  • OK merci, c'est ce que je pensais faire.


    Je me demandais s'il n'y avait des méthodes plus simples (comment faisait-on avant mes contraintes).

    Pour avoir déjà  utilisé cette méthode, son inconvénient est de générer parfois des conflits de contraintes (c'est mon expérience en tout cas)


    @joanna : je m'en suis sorti jusque là  sans avoir jamais utilisé cette notion de child/parent. De même, je n'ai jamais utilisé les storyboards ! Il faudra que j'essaie un jour. ça ne m'attire pas du tout....
  • AliGatorAliGator Membre, Modérateur
    Alors :

    1) Avant les contraintes, c'était la grosse galère. Donc on faisait pas

    2) Si tu as des conflits de contraintes c'est pas à  cause de ça, c'est que ton organisation des contraintes dans une de tes vues n'est pas cohérente

    3) Joanna a raison, si chacune des vues sont gérées par leur propre ViewControlleur, il faut ajouter le ViewController fils en tant que childViewController du ViewController parent. Sinon tu perds la logique de hiérarchie des ViewControllers (et c'est pas juste pour faire joli, c'est aussi utilisé dans la chaine des responders et des choses comme ça)
  • Joanna CarterJoanna Carter Membre, Modérateur
    mars 2015 modifié #6

    Pendant mon dernier projet, j'ai construit un segue sur mesure pour changer d'un "child" viewController à  l'autre. Ce code démontre ce qu'il faut en termes du transfert :



    @implementation AFMTransitionSegue

    - (void)perform
    {
    UIViewController *sourceViewController = self.sourceViewController;

    UIViewController *viewControllerToReplace = sourceViewController.childViewControllers.lastObject;

    if (!viewControllerToReplace)
    {
    return;
    }


    [viewControllerToReplace willMoveToParentViewController:nil];


    UIViewController *destinationViewController = self.destinationViewController;

    [sourceViewController addChildViewController:destinationViewController];

    destinationViewController.view.frame = self.containerView.bounds;

    [sourceViewController transitionFromViewController:viewControllerToReplace
    toViewController:destinationViewController
    duration:0.5
    options:self.animationOptions
    animations:nil
    completion:^(BOOL finished)
    {
    [viewControllerToReplace removeFromParentViewController];

    [destinationViewController didMoveToParentViewController:sourceViewController];
    }];
    }

    @end

  • HerveHerve Membre

    Perso, j'utilise Interface Builder, aussi les UIView "filles" sont les IBOutlets de la "mère". Cela m'a toujours semblé plus simple.


  • AliGatorAliGator Membre, Modérateur
    @Herve avoir des IBOutlet dans la vue mère pointant vers la vue fille est une bonne idée, mais cela ne garantit aucunement :
    (1) que le ViewController de la vue fille, si elle en a un, sera mis en "child" du ViewController de la vue mère. Pour cela dans IB il y a plutôt les Segues de type "Content Segue".
    (2) que la vue fille aura toujours la même taille que la vue mère... à  moins bien sûr que tu mettes les contraintes qu'il faut dans IB justement ;)
Connectez-vous ou Inscrivez-vous pour répondre.