[Obj-C] Vue qui masque une autre vue

Ben77650Ben77650 Membre
janvier 2016 modifié dans API UIKit #1

Hello,


 


Je suis toujours sur le même projet test (que vous pouvez trouver en pj de ce sujet).


 


Il s'avère que parfois lors de certains swipes (notamment ceux vers le haut), mon contenu disparaisse et semble être en dehors des bounds.


 


J'ai donc essayé de faire ça:



if(CGRectContainsRect(screenBound, view1.frame) && CGRectContainsRect(screenBound, view2.frame) && CGRectContainsRect(screenBound, expandButton.frame))

Mais même comme cela, le contenu part en dehors de la zone visible.


 


Si vous avez une idée, je suis preneur.


 


Merci d'avance :)


Réponses

  • Hello,


     


    Bon il s'avère que j'ai remarqué que c'était la view2 qui cachait la view1 et le expandButton, fait un peu n'importe quoi.


     


    J'ai essayé de mettre des conditions sur la position de ces 3 éléments, mais rien n'y fait j'ai toujours ce souci.


     


    Avez-vous des conseils à  m'apporter, j'avoue sécher la.


  • CéroceCéroce Membre, Modérateur
    Je n'ai pas le temps de regarder, mais pourquoi travailles-tu avec screenBound ?
    Tu dois travailler avec les bounds de la vue parente et la frame de la vue.
    (Voir Views Programming Guide pour comprendre la difference entre frame et bounds).


  • Je n'ai pas le temps de regarder, mais pourquoi travailles-tu avec screenBound ?

    Tu dois travailler avec les bounds de la vue parente et la frame de la vue.

    (Voir Views Programming Guide pour comprendre la difference entre frame et bounds).




     


    Sachant que ma vue parente fait la taille de l'écran ça revient au même de faire [[UIScreen mainScreen] bounds] ou [parentView bounds], non ?


     


    Et la frame de la vue c'est bien ce que je fais en la comparant aux bounds.


     


    C'est pas la bonne solution ?

  • CéroceCéroce Membre, Modérateur

    Sachant que ma vue parente fait la taille de l'écran ça revient au même de faire [[UIScreen mainScreen] bounds] ou [parentView bounds], non ?

    Je te retourne ta question: sachant que tu veux la taille de l'élément englobant, pourquoi prendre la taille de l'écran plutôt que celle de la vue parente? Imagine simplement que tu ne veux plus que la vue parente remplisse tout l'écran, tu devras modifier ton code pour rien.

    Par ailleurs, je ne suis pas sûr que l'origine de la vue parente soit en 0, 0, à  cause de la barre de statut, donc il est possible que les deux rectangles ne soient pas les mêmes. Comme je ne suis pas essayer ton code, je ne suis pas sûr de l'origine du problème.


  • Je te retourne ta question: sachant que tu veux la taille de l'élément englobant, pourquoi prendre la taille de l'écran plutôt que celle de la vue parente? Imagine simplement que tu ne veux plus que la vue parente remplisse tout l'écran, tu devras modifier ton code pour rien.


    Par ailleurs, je ne suis pas sûr que l'origine de la vue parente soit en 0, 0, à  cause de la barre de statut, donc il est possible que les deux rectangles ne soient pas les mêmes. Comme je ne suis pas essayer ton code, je ne suis pas sûr de l'origine du problème.




     


    Effectivement j'avais pas forcément raisonné comme cela bonne remarque, merci :D


     


    Après ca n'empêche pas mes 3 éléments de se superposer :/

  • CéroceCéroce Membre, Modérateur
    J'ai jeté un bon oe“il à  ton code. C'est ta méthode qui est compliquée. Tu cherches à  chaque fois à  savoir de combien tu vas relever ou abaisser pour passer cette valeur à  expandView:.
    Alors qu'on s'en moque, ce qu'on veut, c'est savoir quelle est la nouvelle hauteur de view1. Tout devient alors plus simple: c'est expandView qui s'assure que ni view1 ni view2 n'auront une hauteur inférieure à  zéro.

    P.S.: il faut vraiment que quelqu'un t'explique comment on déclare des variables d'instance en ObjC. J'ai cru comprendre qu'il y avait quelqu'un qui te chapeautait.


  • J'ai jeté un bon oe“il à  ton code. C'est ta méthode qui est compliquée. Tu cherches à  chaque fois à  savoir de combien tu vas relever ou abaisser pour passer cette valeur à  expandView:.

    Alors qu'on s'en moque, ce qu'on veut, c'est savoir quelle est la nouvelle hauteur de view1. Tout devient alors plus simple: c'est expandView qui s'assure que ni view1 ni view2 n'auront une hauteur inférieure à  zéro.




     


    Changer la taille de view1 c'est un fait, mais après comment ordonnancer les autres ? Mettre expandButton.Y à  view1.y + view1.height (oui c'est pas la syntaxe mais j'abrège) et mettre view2.y à  expandButton.y + expandButton + height ?


    Parce que si les 3 composants ont une hauteur supérieur à  zéro ils peuvent quand même se superposer et donc ça n'est pas le résultat attendu.


     




    P.S.: il faut vraiment que quelqu'un t'explique comment on déclare des variables d'instance en ObjC. J'ai cru comprendre qu'il y avait quelqu'un qui te chapeautait.




     


    Oui effectivement quelqu'un me chapeaute de manière rapide (même si généralement j'ai souvent le droit à  un "J'ai pas le temps"). Concernant les variables d'instances, pourquoi m'en parles tu ? Je sais les utiliser mais j'en ai pas forcément vu l'utilité dans ce cadre la. Tu aurais mis le maxHeight, minHeight et viewBound en tant que tel ?


  • CéroceCéroce Membre, Modérateur
    janvier 2016 modifié #9

    Changer la taille de view1 c'est un fait, mais après comment ordonnancer les autres ? Mettre expandButton.Y à  view1.y + view1.height (oui c'est pas la syntaxe mais j'abrège) et mettre view2.y à  expandButton.y + expandButton + height ?

    Parce que si les 3 composants ont une hauteur supérieur à  zéro ils peuvent quand même se superposer et donc ça n'est pas le résultat attendu.



    Non, c'est facile. La hauteur totale est self.view.bounds.size.height.

    Tu passes la hauteur voulue de view1, tu détermines le y et la hauteur des autres vues. La seule difficulté est de s'assurer que hauteurView1 < hauteurTotale-hauteurExpandView.

     



    Oui effectivement quelqu'un me chapeaute de manière rapide (même si généralement j'ai souvent le droit à  un "J'ai pas le temps"). Concernant les variables d'instances, pourquoi m'en parles tu ? Je sais les utiliser mais j'en ai pas forcément vu l'utilité dans ce cadre la. Tu aurais mis le maxHeight, minHeight et viewBound en tant que tel ?



    Pas du tout, puisqu'on n'a pas besoin de les mémoriser, on peut les déterminer à  tout moment.


    Voici ton code annoté. Ne le prends pas mal, j'essaie de te faire progresser:


     


     



  • Non, c'est facile. La hauteur totale est self.view.bounds.size.height.

    Tu passes la hauteur voulue de view1, tu détermines le y et la hauteur des autres vues. La seule difficulté est de s'assurer que hauteurView1 < hauteurTotale-hauteurExpandView.



     

    Ok ça m'éclaire un peu plus du coup.

     



    Pas du tout, puisqu'on n'a pas besoin de les mémoriser, on peut les déterminer à  tout moment.


    Voici ton code annoté. Ne le prends pas mal, j'essaie de te faire progresser:



     

    Ah non au contraire, je suis heureux que tu me fasses un feedback, j'estime que j'ai encore à  apprendre et que je peut progresser.

     

    Pour répondre à  certains de tes commentaires / remarques dans le code (pour ce que j'en ai vu et corrigé actuellement) :

    - j'ai retiré les synthesize

    - j'ai réglé la BGColor de la collectionView dans le XIB

    - j'ai utilisé les getters au lieu des variable d'instance

    - le 10 est une valeur en dur, permettant de laisser un espace entre 2 vues

    - la vitesse peut être négative, si l'utilisateur swipe up (c'est la solution qui m'avais été donné par Draken ici )

     

    Le reste je n'ai pas encore regardé / analysé.

     

    Merci en tout cas pour ton aide


  • CéroceCéroce Membre, Modérateur

    Essaie, mais vraiment, c'est plus simple que tu ne le penses, ce sont les concepts que tu utilises qui compliquent tout. Réfléchis sur la hauteur, et pas sur le décalage, tu vas grandement te simplifier la vie. Et franchement, vu le peu de code que tu as, n'hésite pas à  tout chambouler.


  • Ben77650Ben77650 Membre
    février 2016 modifié #12

    Problème réglé en faisant comme cela 



    #import "ViewController.h"
    #import "weatherCell.h"

    @interface ViewController ()
    @property (nonatomic) CGPoint startLocation;
    - (IBAction)panGesture:(UIPanGestureRecognizer *)sender;

    @end

    @implementation ViewController

    int maxHeight;
    int minHeight;
    CGRect viewBound;

    - (void)viewDidLoad {

    [super viewDidLoad];

    viewBound = [self.view bounds];

    [self.collecView registerClass:[WeatherCell class] forCellWithReuseIdentifier:@WeatherCell];
    UINib *cellNib = [UINib nibWithNibName:@WeatherCell bundle:nil];
    [self.collecView registerNib:cellNib forCellWithReuseIdentifier:@WeatherCell];

    [self.collecView setDataSource:self];
    [self.collecView setDelegate:self];

    maxHeight = self.collecView.frame.origin.y + self.collecView.frame.size.height;
    minHeight = self.statusLabel.frame.origin.y + self.statusLabel.frame.size.height;
    }

    - (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    }


    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
    {
    return 10;
    }


    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {
    WeatherCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@WeatherCell forIndexPath:indexPath];

    return cell;
    }

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {
    return CGSizeMake(50, 75);
    }

    - (void)panGesture:(UIPanGestureRecognizer *)sender {


    if (sender.state == UIGestureRecognizerStateBegan) {
    self.startLocation = [sender locationInView:self.view];
    }

    if(sender.state == UIGestureRecognizerStateChanged) {

    CGPoint stopLocation = [sender locationInView:self.view];
    CGFloat distance = stopLocation.y - self.startLocation.y;

    if(self.view1.frame.size.height >= 80 && self.view1.frame.size.height <= 220) {
    [self extandView:distance];
    }
    }
    }

    - (void) extandView:(CGFloat)heightTobeExpanded
    {
    CGRect view1Frame;
    CGRect view2Frame;
    CGRect expandButtonFrame;

    view1Frame = CGRectMake(self.view1.frame.origin.x, self.view1.frame.origin.y, self.view1.frame.size.width, self.view1.frame.size.height + heightTobeExpanded);

    expandButtonFrame = CGRectMake(self.expandButton.frame.origin.x, self.expandButton.frame.origin.y + heightTobeExpanded, self.expandButton.frame.size.width, self.expandButton.frame.size.height);

    view2Frame = CGRectMake(self.view2.frame.origin.x, self.view2.frame.origin.y + heightTobeExpanded, self.view2.frame.size.width, self.view2.frame.size.height - heightTobeExpanded);

    [UIView animateWithDuration:0.0
    animations:^{
    if(view1Frame.size.height >= 80 && view1Frame.size.height <= 220)
    [self.view1 setFrame:view1Frame];

    if(expandButtonFrame.origin.y >= 120 && expandButtonFrame.origin.y <= 240)
    [self.expandButton setFrame:expandButtonFrame];

    if(view2Frame.size.height >=395 && view2Frame.size.height <=515 && view2Frame.origin.y >=150 && view2Frame.origin.y <=270)
    [self.view2 setFrame:view2Frame];
    }
    completion:nil];

    }
    @end

Connectez-vous ou Inscrivez-vous pour répondre.