2010-11-20 4 views
3

J'ai modifié l'exemple Scrolling d'Apple pour récupérer une série d'images créées à partir de fichiers référencés dans CoreData objets. Je peux ajouter les images bien, mais je veux aussi ajouter par programme un UIButton à chaque image. Le nombre d'images dépend du nombre d'objets CoreData, donc je ne peux pas utiliser IB.Ajout par programme de UIButtons et UIImages à un UIScrollview

Quelqu'un peut-il m'aider à trouver la meilleure façon de l'implémenter?

Voici le code qui saisit les images du CoreData magasin:

NSUInteger i; 
for (i = 1; i <= kNumImages; i++) 
{ 
    Sentence *testSentence = [[managedObjectContext executeFetchRequest:request error:&error] objectAtIndex:i]; 

    NSArray *paths  = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *imageName = [[paths objectAtIndex:0] stringByAppendingPathComponent:[testSentence image]]; 
    NSLog(@"imageName: %@", imageName); 

    UIImage *image = [[UIImage alloc] initWithContentsOfFile:imageName]; 
    NSLog(@"image: %@", image); 

    UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
    NSLog(@"imageView: %@", imageView); 

    [imageView setContentMode:UIViewContentModeScaleAspectFit]; 
    [imageView setBackgroundColor:[UIColor blackColor]]; 

    // 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]; 

    [image release]; 
    [imageView release]; 
} 

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

Et voici le code qui définit les images dans le 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)]; 
} 

Répondre

1

Je ne sais pas, je comprends votre problème. Tu ne pourrais pas faire ça?

... 
imageView.frame = rect; 
UIButton *aButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
aButton.frame = imageView.frame; 
[aButton addTarget:self action:@selector(whatever:) forControlEvents:UIControlEventTouchUpInside]; 
[imageView addSubview:aButton]; 
+0

Merci pour votre réponse. Yup qui fonctionne - mais je ne peux pas cliquer sur le bouton (il ignore fermement mes clics/robinets - oui j'ai changé l'action), et je veux un bouton qui n'est pas la même taille que le imageView.frame. Des idées? – glenstorey

+0

Vous voulez probablement dire 'aButton.frame = imageView.bounds', bien que dans ce cas je ne pense pas que cela soit important. Vous devrez peut-être également définir imageView.userInteractionEnabled = YES (la valeur par défaut est NO pour UIImageView, IIRC). –

+0

Trié la taille du bouton/imageframe merci - mais je ne peux pas l'obtenir pour cliquer du tout. J'ai essayé: [aButton setUserInteractionEnabled: YES]; [aButton setEnabled: YES]; [aButton setAlpha: 1]; et je n'arrive pas à avancer. Est-il possible de déboguer ce que vous cliquez? Des stratégies pour faire fonctionner les choses? – glenstorey

1

J'ai eu le même problème où je créais une galerie d'images et les boutons que j'ai ajoutées à chaque vignette ne répondrait pas à des événements TouchUpInside.

J'ai réussi à le faire fonctionner en créant une sous-classe UIView personnalisée pour contenir chaque image individuelle et en implémentant touchesBegan: withEvent: et touchesEnded: withEvent: dans cette sous-classe.

Voir le UIScrollView programming guide pour l'exemple de code.

Si vous n'autorisez pas le zoom sur l'UIScrollView, vous pouvez simplifier le code en supposant que chaque extrémité tactile est un simple événement tactile.

Questions connexes