2013-06-05 12 views
5

poiché non è possibile utilizzare alcun framework per creare un album di foto, sto cercando di crearne uno utilizzando Raccolta vista, ma all'inizio mi sono bloccato.Gestione del gesto di tocco in un UICollectionView

Il mio obiettivo è quello di visualizzare tutte le immagini dal mio servizio web nella mia vista raccolta, poiché tutte visualizzate, il passo successivo è quando qualcuno tocca una cella, posso aprirla in una nuova vista e navigare tra tutte.

ecco il codice di base che ho creato:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    [collectionController reloadData]; 
    tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:nil action:@selector(touched)]; 

    tapGesture.numberOfTapsRequired = 1; 


} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{ 

    return 1; 

} 

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ 

    return 6; 
} 

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    static NSString *cellIdentifier = @"Cell"; 

    CollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; 
    [cell.imgCollection setImageWithURL:[NSURL URLWithString:@"http://sallescds.com.br/wp-content/uploads/2012/12/xepop-300x300.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

    [cell.imgCollection addGestureRecognizer:tapGesture]; 

    return cell; 
} 

-(void)touched:(UIGestureRecognizer *)tap{ 

    NSLog(@"the touch happened"); 
} 

grazie ragazzi.

risposta

14

Un paio di cose non sono proprio nel codice:

primo, initWithTarget:action: non dovrebbe essere passato un valore nil per bersaglio. Da the docs:

obiettivo

Un oggetto che è il destinatario di messaggi di azione inviati dal ricevitore quando riconosce un gesto. nil non è un valore valido.

Nel tuo caso si dovrebbe passare self come bersaglio perché si vuole inviato il messaggio touched: all'istanza corrente della classe.

Secondo, il selettore passato a initWithTarget:action: è errato. Hai utilizzato @selector(touched) ma l'implementazione del metodo è - (void)touched:(UIGestureRecognizer *)tap;, il cui selettore è @selector(touched:) (attenzione allo :).

Si consiglia di leggere this question on selectors se si è confusi.

Terzo, non è possibile collegare un singolo UIGestureRecognizer alla visualizzazione multipla (vedi this SO question).

Quindi, per farlo funzionare, è possibile creare uno UITapGestureRecognizer per cella di raccolta (forse in una sottoclasse). O meglio ancora, implementa il tuo metodo UICollectionViewDelegatecollectionView:didSelectItemAtIndexPath:.

EDIT - Come implementare collectionView:didSelectItemAtIndexPath::

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    // Bind the collectionView's delegate to your view controller 
    // This could also be set without code, in your storyboard 
    self.collectionView.delegate = self; 
} 

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 1; 
} 

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

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    static NSString *cellIdentifier = @"Cell"; 

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; 
    [cell.imgCollection setImageWithURL:[NSURL URLWithString:@"http://sallescds.com.br/wp-content/uploads/2012/12/xepop-300x300.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

    return cell; 
} 

// I implemented didSelectItemAtIndexPath:, but you could use willSelectItemAtIndexPath: depending on what you intend to do. See the docs of these two methods for the differences. 
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // If you need to use the touched cell, you can retrieve it like so 
    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; 

    NSLog(@"touched cell %@ at indexPath %@", cell, indexPath); 
} 
+0

capito, ho già fissato questi problemi, il mio errore quando stavo traducendo i miei nomi metodi per inglese. Grazie per l'aiuto, ora devo capirlo, come farlo in UICollectionViewDelegate, perché non ne ho idea. Potresti darmi un esempio o qualcosa del genere? –

+0

Ok, quindi devo chiamare questo metodo - (BOOL) collectionView: (UICollectionView *) collectionView shouldSelectItemAtIndexPath: (NSIndexPath *) indexPath; e creare il gesto al suo interno? –

+2

Questo è in realtà molto più semplice. Se si implementano i metodi dei delegati, non sono necessari riconoscitori di gesti. Il delegato chiamerà l'implementazione dei suoi metodi quando viene rilevato un tocco. Nota che non dovresti chiamare esplicitamente 'shouldSelect..' o' didSelect..', il delegato lo fa per te. –

Problemi correlati