2014-07-11 4 views
10

Ho uno UICollectionView che contiene elementi diversi. Quando si tocca su un elemento, io uso:Come ricevere tocchi su UICollectionView nello spazio vuoto attorno a tutte le celle

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 

di capire ciò che è stato toccato e quindi fondamentalmente impostare l'alfa di quella vista a 0 per nasconderlo. Tutto funziona bene Ora quello che mi piacerebbe fare è quando tocchi lo spazio bianco che circonda tutte le UICollectionViewCell s tutte le visualizzazioni quindi riappare. Ho difficoltà a trovare un metodo che mi consenta di sapere quando lo spazio bianco attorno alle celle è stato toccato. C'è un buon modo per farlo? Ho provato ad installare un sistema di riconoscimento gesto, ma quando lo faccio, il mio metodo

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 

non viene chiamato. C'è un modo per implementare il riconoscimento dei gesti e da lì determinare se una cella è stata sfruttata e in tal caso nascondere quella cella, altrimenti mostrare tutte le celle nascoste? Grazie.

+0

Vorrei suggerire di utilizzare le viste di un decoratore e di ascoltare i tap quando si troverebbero dietro il cel l. –

+0

cos'è esattamente una vista decoratore. Ho una vista dietro il collectionView ma non registrerò i tocchi.Devo in qualche modo passare i tocchi a quella vista di sfondo quando non toccano una cella e non so come fare quello giusto –

risposta

0

didSelectItem il metodo delegato verrà chiamato solo quando l'utente seleziona collectionViewCell. Lo spazio tra le celle può variare in base alla dimensione di ciascuna cella, è possibile specificare solo la spaziatura minima. Per ricevere i tocchi, mantenere additionalViewView come backgroundView cambiando il suo zindex, aggiungere ad esso il rilevamento touch. Spero che questo ti possa aiutare. :)

+0

così ho provato a fare che il problema è che i tocchi non vengono passati al backgroundView –

15

Sono riuscito a risolvere questo problema utilizzando uno UITapGestureRecognizer su UICollectionViewbackgroundView. E 'in Swift, ma l'idea è chiara:

self.tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "handleTap:") 
self.tapGestureRecognizer.delegate = self 

self.collectionView.backgroundView = UIView(frame:self.collectionView.bounds) 
self.collectionView.backgroundView!.addGestureRecognizer(tapGestureRecognizer) 

E il callback:

func handleTap(recognizer: UITapGestureRecognizer) { 
    // Handle the tap gesture 
} 
+0

Ottima idea! Grazie! – nonamelive

3

mi sono imbattuto in uno scenario simile nel mio progetto e risolto nel modo seguente:

let tapGestureRecogniser = UITapGestureRecognizer(target: self, action: #selector(handleTapEmptySpaceGesture)) 
tapGestureRecogniser.delegate = self 
collectionView.addGestureRecognizer(tapGestureRecogniser) 

Implementare il protocollo UIGestureRecognizerDelegate

Quindi implementare la seguente funzione in il protocollo:

func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { 
    // only handle tapping empty space (i.e. not a cell) 
    let point = gestureRecognizer.locationInView(collectionView) 
    let indexPath = collectionView.indexPathForItemAtPoint(point) 
    return indexPath == nil 
} 

In sostanza se il clic su una cella allora il vostro sistema di riconoscimento gesto non inizia, permettendo la selezione normale/deselezionare i delegati per l'esecuzione. Altrimenti, se si trova su uno spazio vuoto, il tuo riconoscitore gestisce il rubinetto e gestisce il suo gestore.

+0

Questo ha funzionato perfettamente! Grazie! –

0

questo ha funzionato per me su Swift 2.3

Fase 1: Attuare il protocollo UIGestureRecognizerDelegate

Fase 2: Impostare UITapGestureRecognizer sulla UICollectionView backgroundView

Fase 3: Handle cosa fare alla spina all'interno handleTap funzione

class namScreenVcc: UICollectionViewController, UIViewControllerTransitioningDelegate, UIGestureRecognizerDelegate 
{ 
    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) 
     tapGestureRecognizer.delegate = self 

     collectionView!.backgroundView = UIView(frame: collectionView!.bounds) 
     collectionView!.backgroundView!.addGestureRecognizer(tapGestureRecognizer) 
    } 

    func handleTap(recognizer: UITapGestureRecognizer) 
    { 
     // Handle the tap gesture 
    } 
}