0

J'ai le code suivant qui fonctionne bien UIScrollView. Mais lors du chargement de l'image peut être vu seulement à la dernière sous-vue et UIActivityIndicatorView ne fonctionne pas pour le chargement de chaque image.Chargement de UIImageView de l'URL à UIScrollView avec UIActivityIndicatorView pour chaque UIImageView

Comment faire pour une telle tâche?

myProject2ViewController.h

#import <UIKit/UIKit.h> 
#import "PageScrollView.h" 

@interface myProject2ViewController : UIViewController 
{ 
    NSMutableArray *pages; 
    PageScrollView *scrollView; 
    UIView *myOneSubview; 
    UIImageView *imageView; 
    UIActivityIndicatorView *myIndicator; 
} 

@property (nonatomic, retain) PageScrollView *scrollView; 
@property (nonatomic, retain) UIImageView *imageView; 
@property (nonatomic, retain) UIActivityIndicatorView *myIndicator; 

@end 

myProject2ViewController.m

#import "myProject2ViewController.h" 

@implementation myProject2ViewController 

@synthesize scrollView; 
@synthesize imageView; 
@synthesize myIndicator; 

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

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSArray *imageUrls = [NSArray arrayWithObjects: 
          @"link_1", 
          @"link_2", 
          @"link_3", 
          nil]; 

    pages = [[NSMutableArray alloc] init]; 

    for (int i = 0; i < [imageUrls count]; i++) { 

     CGRect frameOne = CGRectMake(0.0f, 50.0f, 320.0f, 416.0f); 
     myOneSubview = [[UIView alloc] initWithFrame:frameOne]; 
     myOneSubview.backgroundColor = [UIColor blackColor]; 

     NSString *imageUrl = [imageUrls objectAtIndex:i]; 

     myIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
     myIndicator.center = CGPointMake(160.0f, 130.0f); 
     myIndicator.hidesWhenStopped = YES; 
     myIndicator.backgroundColor = [UIColor clearColor]; 

     imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 50.0f, 320.0f, 416.0f)]; 

     [NSThread detachNewThreadSelector:@selector(loadImages:) toTarget:self withObject:imageUrl]; 

     [myOneSubview addSubview:imageView]; 

     [pages addObject:myOneSubview]; 
    } 

    scrollView = [[PageScrollView alloc] initWithFrame:self.view.frame]; 
    scrollView.pages = pages; 
    scrollView.delegate = self; 
    self.view = scrollView; 
} 

- (void)loadImages:(NSString *)string 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    [myIndicator startAnimating]; 

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 


    NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:string]]; 
    UIImage *image = [[UIImage alloc] initWithData:imageData]; 
    [imageView setImage:image]; 

    [image release]; 
    [imageData release]; 

    [self performSelectorOnMainThread:@selector(loadImageComplete) withObject:self waitUntilDone:YES]; 

    [pool drain]; 
} 

-(void)loadImageComplete 
{ 
    NSLog(@"Load image complete!"); 
    [myIndicator stopAnimating]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 

@end 

Répondre

0

Quand vous faites:

CGRectMake(0.0f, 50.0f, 320.0f, 416.0f); 

l'intérieur de votre boucle, vous spécifiez les mêmes po exact sition et dimension pour CHAQUE image que vous créez dans la boucle for. En d'autres termes, chaque image suivante sera placée en haut de l'image précédente, par conséquent, vous ne verrez que l'image finale que vous avez créée dans la boucle for. Essayez d'ajouter votre variable compteur "i" à la valeur X et Y dans CGRectMake() pour compenser chaque image qui sera créée par la suite.

Alors laissez-dire chaque image est de 100 pixels par 100 pixels, alors quelque chose comme:

CGRectMake(0.0f + (i * 100.0f), 50.0f, 320.0f, 416.0f); 

Feraient chaque image assis juste après la précédente (puisque chaque image est de 100 pixels de large, nous compensons par 100 pixels et utilisez cette valeur comme point de départ de l'image suivante). Si vous ajoutez une valeur supplémentaire après (i * 100) pour qu'elle devienne (i * 100 + 50), cela vous donnera un remplissage à gauche de 50 pixels de l'image précédente. Si vos images sont de dimensions différentes, vous devrez calculer la largeur et la hauteur de l'image avant de les intégrer dans votre méthode CGRectMake().

Espérons que ça aide.

En outre, au lieu de créer autant de vues à ajouter à votre point de vue de défilement, vous pouvez écrire le code comme ceci:

scrollView = [[UIScrollview alloc] init]; 

. . . 

for(...) 
{ 
    UIImageView *currentImage = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f + (i * 100.0f), 50.0f, 320.0f, 416.0f); 
    [currentImage setImage:[UIImage imageNamed:[imageUrls objectAtIndex:i]]]; 

    . . . 

    [scrollView addSubview: currentImage]; 
    [currentImage release]; 
} 
+0

Merci pour votre réponse. Mais ScrollView fonctionne bien. Ceci est défini par une classe distincte (# import "PageScrollView.h" .) Cette classe crée un worker ScrollView à partir d'un tableau de "pages". – scazy0rg

Questions connexes