(Réglé) Vue longue à  s'afficher

Ben77650Ben77650 Membre
juillet 2014 modifié dans API UIKit #1

Bonjour,


 


J'ai un problème avec ma vue qui met relativement longtemps (3-4 secondes) à  s'afficher quand il y a plusieurs photos. Le code est plus bas. Avant tout certaines précisions s'imposent:


  • listePhotos est un NSMutableArray défini dans la vue précédente
  • dicoDetail est un NSMutableDictionnary lui aussi défini précédemment
  • l'index "monIndex" du dictionnaire contient les images

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title=@Galerie photo;
        _baseURL = @http://www.monsite.com/pics/photos/;
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    double ratioImg;
    
    pageControl.numberOfPages=[[_dicoDetail objectForKey:@monIndex] count];
    
    for(int i=0; i<[[_dicoDetail objectForKey:@monIndex] count]; i++)
    {
        
        CGRect frame;
        frame.origin.x=scroller.frame.size.width*i;
        frame.origin.y=0;
        frame.size=scroller.frame.size;
        
        UIImageView* imageView = [[UIImageView alloc]initWithFrame:frame];
        
        if([[_dicoDetail objectForKey:@monIndex] objectAtIndex:i])
        {
            NSString* imgLink=[[_dicoDetail objectForKey:@monIndex]objectAtIndex:i];
            NSString* lienImg = [NSString stringWithFormat:@%@%@",_baseURL,imgLink];
            NSURL* urlImg = [NSURL URLWithString:[lienImg stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
            UIImage* tempImg =[UIImage imageWithData:[NSData dataWithContentsOfURL:urlImg]];
            
            int hauteurImg =tempImg.size.height;
            int largeurImg = tempImg.size.width;
            int largeurView = imageView.frame.size.width;
            int hauteurView = imageView.frame.size.height;
            
            
            
            if(hauteurImg > largeurImg)
            {
                ratioImg= tempImg.size.height/tempImg.size.width;
                frame.size.height=largeurView*ratioImg;
                frame.origin.y=-50;
                imageView.frame = frame;
                
                if(hauteurImg >hauteurView)
                {
                    CGSize sizeImg = tempImg.size;
                    
                    ratioImg= sizeImg.height/sizeImg.width;
                    sizeImg.height=445;
                    sizeImg.width=sizeImg.height/ratioImg;
                    
                    
                }
                
                
            }
            
            else if (largeurImg > hauteurImg)
            {
                ratioImg= tempImg.size.height/tempImg.size.width;
                frame.size.height=largeurView*ratioImg;
                
                /*if(hauteurImg<=175)
                 {
                 frame.origin.y=100;
                 }
                 else if (hauteurImg>176 && hauteurImg<=200)
                 {
                 frame.origin.y=66;
                 }
                 else
                 {
                 frame.origin.y=50;
                 }*/
                
                imageView.frame = frame;
            }
            
            else if (largeurImg == hauteurImg)
            {
                ratioImg= tempImg.size.height/tempImg.size.width;
                frame.size.height=largeurView*ratioImg;
                imageView.frame = frame;
                
            }
            
            imageView.image=tempImg;
        }
        
        [scroller addSubview:imageView];
    }
    scroller.contentSize=CGSizeMake(scroller.frame.size.width*[[_dicoDetail objectForKey:@monIndex] count], scroller.contentSize.height);
    
    
    self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:@selector(back)];
    
    UIBarButtonItem *refresh = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh)];
    self.navigationItem.rightBarButtonItem = refresh;
    
}

#pragma mark - UIScrollView Delegate
- (void)scrollViewDidScroll:(UIScrollView *)sender
{
    CGFloat pageWidth = scroller.frame.size.width;
    int page = floor((scroller.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    self.pageControl.currentPage = page;
}

-(void) refresh{
    [self.view setNeedsDisplay];
}

-(void) back{
    DetailViewController* detail = [[DetailViewController alloc]init];
    detail.offreDetail=listePhotos;
    detail.dicoDetail=_dicoDetail;
    detail.offset=_offset;
    detail.numpage=_numpage;
    [self.navigationController pushViewController:detail animated:NO];
}

Merci d'avance à  ceux qui m'aideront.


 


Si vous nécessitez plus de détails je peut vous en fournir.


Réponses

  • CéroceCéroce Membre, Modérateur
    Les grosses images mettent du temps à  se charger.
  • Est ce que j'ai moyen de les resizer s'il te plait (les images, pas l'imageviewcontroller).


  • Ben77650Ben77650 Membre
    juin 2014 modifié #4

    D'ailleurs que pensez-vous de l'UIImageView mettant toutes les images côte à  côte ?


     


    Je fais un slider photo et c'est la seule solution que j'ai trouvée, après si vous en avez d'autres je prends, car je suis pas forcément fan de la solution actuelle (même si elle fonctionne plutôt bien).


     


    Que pensez-vous de cela svp ?


     


    https://github.com/nicklockwood/iCarousel


  • Vu que tu mets du temps a télécharger l'image sur le net je dirais que la meilleurs solution est de retailler les images sur le serveur avant de les envoyer. 


  • Ok je prends note merci


     




    D'ailleurs que pensez-vous de l'UIImageView mettant toutes les images côte à  côte ?


     


    Je fais un slider photo et c'est la seule solution que j'ai trouvée, après si vous en avez d'autres je prends, car je suis pas forcément fan de la solution actuelle (même si elle fonctionne plutôt bien).


     


    Que pensez-vous de cela svp ?


     


    https://github.com/nicklockwood/iCarousel




     


    Un avis sur la question peut être stp ?


  • samirsamir Membre

    Salut Ben,


     


    Mais que veux-tu faire exactement ?


     


    iCaroussel est une bonne lib pour réaliser un carrousel sous iOS.


  • J'uitilise iCarousel ça fonctionne plutôt bien mais il reste quelques bug quand même l'avantage étant qu'il permet de faire une boucle infini sur les images sans se prendre la tête. Il est basé sur le principe de délégation et permet aussi les click sur les images c'est relativement complet.




  • Salut Ben,


     


    Mais que veux-tu faire exactement ?


     


    iCaroussel est une bonne lib pour réaliser un carrousel sous iOS.




     


    Je cherche à  faire un slider photo, avec une liste de photos et quand on slide à  droite ou à  gauche cela change de photo.


     


    Autrement j'ai trouvé ça aussi:


    https://github.com/timd/UICollectionViewGallery


     


    Quelqu'un d'entre vous à  testé ? Pour ce que j'ai besoin de faire iCaroussel est vraiment la meilleure des solutions ?

  • Si tu cherche l'effet carousel, utilise la lib iCaroussel pour le réaliser plutot de te casser les dents à  le refaire toi même.


     


    Si tu veux juste une galerie photo qui slide, ben tu peux le réaliser facilement toi même avec une simple scrollView et des UIImageView. 


     


    Voici un petit tutorial : http://www.raywenderlich.com/10518/how-to-use-uiscrollview-to-scroll-and-zoom-content


  • Après m'être renseigné l'image fait 200 ko grand maximum (même si généralement elle fait environ 30 ko), donc elle est pas si lourde que ça.


     


    Sinon merci Samir j'ai bien pris note du lien (que j'avais par ailleurs déjà  trouvé), mais j'utilise pas les storyboards, donc le commencement est un peu différent.


     


    Autrement je vois pas ce qu'est l'effet carrousel...


  • AliGatorAliGator Membre, Modérateur
    Session vidéo de la WWDC 2010 "Designing Apps with Scrillviews". ça va t'apprendre les principes de base sur le recycling.
  • Ok merci


  • Ben77650Ben77650 Membre
    juin 2014 modifié #14


    Si tu veux juste une galerie photo qui slide, ben tu peux le réaliser facilement toi même avec une simple scrollView et des UIImageView. 


     


    Voici un petit tutorial : http://www.raywenderlich.com/10518/how-to-use-uiscrollview-to-scroll-and-zoom-content




     


    Bon après avoir regardé et testé le code qu'il met à  dispo j'ai bien l'impression qu'il marche de la même manière que moi, à  savoir une seule UIImageView qui fait la largeur des x images, et qui contient ces x images dedans...


  • AliGatorAliGator Membre, Modérateur
    juin 2014 modifié #15
    Utilise iCarousel. Ou tout autre composant qui fait du recycling. Une UICollectionView par exemple fait très bien l'affaire.


    Mais surtout pas tout charger d'un coup. (Cf la même vidéo WWDC2010)
  • ICarousel et l'UICollectionView sont deux solutions que j'ai trouvé (cf plus haut les GitHub) mais je savais pas ce que ça valait.


     


    Je regarderais la vidéo à  l'occasion mais pas maintenant, je vais pas prendre presque 1H sur mon temps de travail pour regarder ça ;)


  • ça fait partie de la formation tu prends du temps pour te former pour devenir plus performant par la suite je ne vois pas pourquoi tu ne ferais pas ça sur tes heures de travail. à‰videmment rien ne t'empêche de te former aussi chez toi et si tu as des dead line serré vaut mieux pas trop trainer sur les vidéos (enfin il faudra bien le faire à  un moment) mais sinon ça me parait pas aberrant de se former sur son lieu de travail.


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