2009-06-22 4 views
0

Je construis une application basée sur l'exemple de code "défilant" fourni par Apple. Tout fonctionne très bien. La nature des images que je veux afficher rendrait souhaitable, si l'ordre des images est inversé, et que la première image visible soit la plus à droite plutôt que la plus à gauche. Fondamentalement, l'utilisateur devrait revenir en arrière, de droite à gauche, plutôt que de gauche à droite. Mais maintenant: je ne comprends pas la syntaxe qu'utilise Apple, et j'espère que quelqu'un pourra m'expliquer ce qui se passe. Voici les parties pertinentes de l'exemple d'application:iphone UIScrollView positionnement inversé

- (void)viewDidLoad 
{ 
    self.view.backgroundColor = [UIColor whiteColor]; 

    // load all the images from our bundle and add them to the scroll view 
    NSUInteger i; 
    for (i = 1; i <= kNumImages; i++) 
    { 
     NSString *imageName = [NSString stringWithFormat:@"image%d.jpg", i]; 
     UIImage *image = [UIImage imageNamed:imageName]; 
     UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 

     // setup each frame to a default height and width, it will be properly placed when we call "updateScrollList" 
     CGRect rect = imageView.frame; 
     rect.size.height = kScrollObjHeight; 
     rect.size.width = kScrollObjWidth; 
     imageView.frame = rect; 
     imageView.tag = i; // tag our images for later use when we place them in serial fashion 
     [scrollView1 addSubview:imageView]; 
     [imageView release]; 
    } 

    [self layoutScrollImages]; // now place the photos in serial layout within the scrollview 

} 

- (void)layoutScrollImages 
{ 
    UIImageView *view = nil; 
    NSArray *subviews = [scrollView1 subviews]; 

    // reposition all image subviews in a horizontal serial fashion 
    CGFloat curXLoc = 0; 
    for (view in subviews) 
    { 
     if ([view isKindOfClass:[UIImageView class]] && view.tag > 0) 
     { 
      CGRect frame = view.frame; 
      frame.origin = CGPointMake(curXLoc, 0); 
      view.frame = frame; 

      curXLoc += (kScrollObjWidth); 
     } 
    } 

    // set the content size so it can be scrollable 
    [scrollView1 setContentSize:CGSizeMake((kNumImages * kScrollObjWidth), [scrollView1 bounds].size.height)]; 
} 
+0

Quelle partie de la syntaxe rencontrez-vous des problèmes? – diederikh

+0

Il s'agit essentiellement de choses liées au CG. J'ai essayé juste de changer "pour (i = 1; i <= kNumImages; i ++)" en "pour (i = kNumImages; i => 1; i--)", mais dans le contexte de mon application, cela livré inattendu résultats. Au-delà, cela ne résout pas mon problème sur la façon d'afficher le dernier «frame» le plus à droite. – Sjakelien

Répondre

1

donc ce que je fini par faire: j'ai inversé l'ordre des sous-vues, puis je fait le saut de scrollview à la dernière « cadre », en ajoutant les lignes suivantes:

CGPoint lastFrame = CGPointMake(((kNumImages -1) * kScrollObjWidth), 0.0f); 
[scrollview setContentOffset:lastFrame]; 

J'espère que cela est en quelque sorte utile à quelqu'un ...

0

Il semble que vous ayez besoin de modifier layoutScrollImages. Initialisez curXLoc au nombre maximum requis et décrémentez-le dans la boucle.

- (void)layoutScrollImages 
{ 
    UIImageView *view = nil; 
    NSArray *subviews = [scrollView1 subviews]; 

    // reposition all image subviews in a horizontal serial fashion 
    CGFloat curXLoc = kNumImages * kScrollObjWidth; 
    for (view in subviews) 
    { 
     if ([view isKindOfClass:[UIImageView class]] && view.tag > 0) 
     { 
       CGRect frame = view.frame; 
       frame.origin = CGPointMake(curXLoc, 0); 
       view.frame = frame; 

       curXLoc -= (kScrollObjWidth); 
     } 
    } 

    // set the content size so it can be scrollable 
    [scrollView1 setContentSize:CGSizeMake((kNumImages * kScrollObjWidth), [scrollView1 bounds].size.height)]; 
} 
+0

Merci pour votre suggestion. Malheureusement, cela ne fonctionne pas, et comme j'essaie toujours de comprendre ce qui se passe dans cette partie du code, je ne suis pas capable de résoudre les problèmes non plus. Cependant, je suis un peu plus proche de la solution: je viens de rétablir l'ordre des sous-vues à un autre endroit du code. La seule chose qui reste maintenant, est d'avoir le scrollView1 le dernier, plutôt que la première sous-vue. – Sjakelien