Resizing et autolayout

Hello,


 


Je suis en train de me battre avec l'autolayout et j'ai un comportement pour le moins étrange.


 


Sur les screenshot iPhone 4 et iPhone 5, on voit que le titre "PXL" est réduit sur l'iphone 4, et pas sur l'iphone 5. C'est une UIImageView.


 


Les autres items sont des boutons.


 


Pourtant j'ai bien toutes les images comme il faut (normal, @2x, @3x).


 


Mots clés:

Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    C'est sur un UINavigationBar ?
  • Non, sur la view principale


  • Bon j'ai effacé toutes les contraintes et c'est ok maintenant, par contre voila le rendu actuel sur les 4 size.


     


  • CéroceCéroce Membre, Modérateur

    Erica Sadun a écrit un livre sur le sujet.


  • ok (bon c'est déjà  "dépassé" non ? (iOS7 et xCode 5)


  • CéroceCéroce Membre, Modérateur

    Sans doute un peu, oui. :-)


     


    Personnellement, j'ai compris comment ça fonctionnait en créant les contraintes par le code.


    La grosse difficulté fut d'arrêter de penser à  la façon de l'autoresizing: le concept est différent. Notamment, il est assez perturbant que les contraintes n'appartiennent pas à  la vue, mais à  sa vue parente.


  • FKDEVFKDEV Membre
    novembre 2014 modifié #8


    Sans doute un peu, oui. :-)


     


    Personnellement, j'ai compris comment ça fonctionnait en créant les contraintes par le code.


    La grosse difficulté fut d'arrêter de penser à  la façon de l'autoresizing: le concept est différent. Notamment, il est assez perturbant que les contraintes n'appartiennent pas à  la vue, mais à  sa vue parente.




     


    Il faut aussi ne pas s'imaginer qu'autolayout fait forcément "plus" et notamment, bien souvent, la solution la plus évidente est de recourir au code.


     


    En tous cas, j'ai souvent bien du mal avec les resizing, c'est-à -dire quand il faut changer la taille des vues filles en fonction de la taille de la superview.


     


    Pour le problème de la collection view, il faut peut-être regarder du côté des content hugging et content compression.


    http://stackoverflow.com/questions/15850417/cocoa-autolayout-content-hugging-vs-content-compression-resistance-priority


  • Oui, mon "soucis" est que j'ai en tete le responsive web design et que je pense en terme de %age et non de valeur (ca serait à  mon avis bien plus puissant d'ailleurs si les contraintes pouvaient être spécifiées en %age de la taille de l'écran mais bon).


  • CéroceCéroce Membre, Modérateur


    (ca serait à  mon avis bien plus puissant d'ailleurs si les contraintes pouvaient être spécifiées en %age de la taille de l'écran mais bon).




    Ben tu peux.


    Les contraintes utilisent des fonctions linéaires y=ax+b.


    Tu donc créer la contrainte: view.width = superview.width*0,5.

  • Mais je dois les créer dans le code du coup, ca passe pas avec IB ?


  • CéroceCéroce Membre, Modérateur

    J'allais compléter ma réponse parce qu'effectivement, ce n'est pas super clair dans l'éditeur graphique.


    - Tire une contrainte (ctrl-clic) vers la superview.


    - Choisis "equal width"


    - Maintenant, édite la contrainte. Tu as deux champs. Mets "multiplier" à  0,5 et "constant" à  0.


    "multiplier" est le a de "y=ax+b", et "constant" le b.


  • oki ceroce, j'essaye ca tout à  l'heure ! Merci :)


  • Dans ton cas c'est la taille des cellules de la collection view qui doit être en pourcentage de la taille de la collection view car les autres éléments ont une taille fixe.


    Enfin je suppose que c'est ce que tu veux faire quand la collection view ne "rentre" pas.


    Un peu comme un UILabel qui a la possibilité de réduire sa taille de police s'il a moins de place.


    Je pense qu'il y a moyen de faire cela en réduisant la valeur de Compression Resistance. 



  • Dans ton cas c'est la taille des cellules de la collection view qui doit être en pourcentage de la taille de la collection view car les autres éléments ont une taille fixe.


    Enfin je suppose que c'est ce que tu veux faire quand la collection view ne "rentre" pas.


    Un peu comme un UILabel qui a la possibilité de réduire sa taille de police s'il a moins de place.


    Je pense qu'il y a moyen de faire cela en réduisant la valeur de Compression Resistance. 




     


    Non je calcule la taille de la cellule :



    - (CGSize)collectionView:(UICollectionView *)collectionView
                      layout:(UICollectionViewLayout*)collectionViewLayout
      sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
        
        if ([collectionView isEqual:self.collectionViewGrid])
        {
            CGFloat cellWidth = [[UIScreen mainScreen] bounds].size.width / numberOfRow ;
            return CGSizeMake(cellWidth, cellWidth);
        }
    .........
    }
  • AliGatorAliGator Membre, Modérateur
    novembre 2014 modifié #16

            CGFloat cellWidth = [[UIScreen mainScreen] bounds].size.width / numberOfRow ;
    }

    Mais pourquoi diable utiliser les bounds du screen (qui sont une information matérielle ne dépendant pas de l'orientation du device, ou des marges entre l'écran, la window, la vue, la collectionView...), alors que ce qui t'intéresse en vrai c'est la largeur de la collectionView ‽

    Tu ferais mieux d'utiliser collectionView.bounds.size.width, ça n'a pas de sens de se baser sur la taille de l'écran plutôt que celle de la collectionView. Si demain tu décides de mettre des marges pour que ta collectionView ne soit pas collée au bord de ton viewController.view mais qu'elle laisse un peu d'espace, ou si jamais un jour tu fais une version iPad et que du coup tu présentes cet écran autrement (dans un UIPopOverViewController, ou dans un UISplitViewController, etc) bref dans un truc qui ne prend pas tout l'écran, y'a plus rien qui va marcher !
  • Ah oui c'est juste, merci !


  • GeoffreyGeoffrey Membre
    novembre 2014 modifié #18

    Alors j'ai fait comme ca finalement, dans le viewdidload, je change la contrainte sur la marge supérieure de ma collection view centrale, et les autres éléments sont dépendants du placement de cette vue.



        NSDictionary *metrics;
        if (IS_IPHONE_4_OR_LESS)
            metrics = @{@topMargin: [NSNumber numberWithInt:60]};
        else
            metrics = @{@topMargin: [NSNumber numberWithInt:200]};

        NSDictionary *views = @{@collectionView: self.collectionViewGrid};
        NSArray *constraint = [NSLayoutConstraint constraintsWithVisualFormat:@V:|-(topMargin)-[collectionView] options:0 metrics:metrics views:views];
        [self.view addConstraints:constraint];

    Par contre il me reste un soucis, impossible de redimensionner les boutons en haut à  gauche et en haut à  droite (meme en collant des contraintes de taille dessus, et avec :



         buttonShare.contentMode = UIViewContentModeScaleToFill
Connectez-vous ou Inscrivez-vous pour répondre.