2015-09-26 8 views
8

Quindi questa è una specie di domanda noobish ma non riesco a capire un modo molto semplice per rilevare indexPath dell'articolo attualmente focalizzato.
Mi sono guardato intorno sperando di vedere qualcosa di molto semplice come collectionView.indexPathOfCurrentlyFocusedItem ma non ho trovato nulla di lontanamente vicino. Così ho scavato e ho cercato di trovare qualcosa di simile a UIFocusEnvironment, UIFocusUpdateContext cercando di trovare la proprietà desiderata, ma non è riuscito. Quindi, l'unica soluzione che riesco a fare è iterare tutte le celle visibili e trovare una cella con la proprietà focalizzata impostata su true.tvOS UICollectionView ottiene il percorso dell'indice dell'articolo attualmente focalizzato

Quindi c'è un modo più semplice ed elegante per trovare il indexPath dell'articolo attualmente focalizzato? (Tranne il monitoraggio attraverso metodo delegato e salvandolo in proprietà vista del controllore)

risposta

7

Usa didUpdateFocusInContect - UICollectionViewDelegate

func collectionView(collectionView: UICollectionView, didUpdateFocusInContext context: UICollectionViewFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) { 
    if collectionView == self.collectionView { 
     print(context.nextFocusedIndexPath) 
    } 
} 

Questo wil restituire l'indexPath della cellula che sta per essere messo a fuoco, si potrebbe anche provare:

context.previouslyFocusedIndexPath 

Dipende da cosa stai cercando di fare.

+1

Grazie per la risposta, l'ho immaginato anch'io. Ma questo mi impone di memorizzare nextFocusedIndexPath in una proprietà, mentre voglio qualcosa di più conveniente come 'collectionView.indexPathOfCurrentlyFocusedItem' – xinatanil

+0

è questa possibile cella di focus per un determinato percorso dell'indice, ovvero fornisce il percorso dell'indice codificato – morroko

18

È possibile utilizzare UIScreen proprietà focusedView come segue per questo:

if let focusedCell = UIScreen.main.focusedView as? UICollectionViewCell { 
    if let indexPath = collectionView.indexPath(for: focusedCell) { 
     print("IndexPath is \(indexPath)") 
    } 
} 
+0

Questa è la risposta perfetta! Grazie uomo. –

2

Ecco come ho realizzato questo shouldUpdateFocusInContext

Soluzione

override func shouldUpdateFocusInContext(context: UIFocusUpdateContext) -> Bool { 

    // The magic is in the next two lines 
    let cell: UICollectionViewCell = context.nextFocusedView as! UICollectionViewCell 
    let indexPath: NSIndexPath? = self.collectionView.indexPathForCell(cell) 

    print(indexPath) 
    // <NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0} 

    return true 
} 
+0

Ha funzionato come un fascino. +1 – rottenoats

2

Così, il vostro obiettivo è quello di fare qualcosa quando si ottiene e si perde attenzione in particolare su una cella sotto tvOS. Il problema è che ti stai spostando attorno ad altri elementi dell'interfaccia utente, e quindi il contesto potrebbe essere diverso. Devi modificare in questo contesto solo le interfacce utente di cui ti devi occupare.

Il posto giusto per rendere l'implementazione è func didUpdateFocusInContext(), in questo modo:

override func didUpdateFocusInContext(
    context:        UIFocusUpdateContext, 
    withAnimationCoordinator coordinator: UIFocusAnimationCoordinator 
) { 
    coordinator.addCoordinatedAnimations({ 
    if let cell = context.previouslyFocusedView as? UICollectionViewCell { 
     cell.layer.borderWidth = 2 
    } 

    if let cell = context.nextFocusedView as? UICollectionViewCell { 
     cell.layer.borderWidth = 5 
    } 
    }, 
    completion: nil) 
} 

Ora stiamo usando il coordinatore attenzione di applicare la nostra logica:

  • Quando la precedenza focalizzata l'elemento è UICollectionViewCell, quindi devi rilasciare lo stato attivo sull'elemento successivo. Non dovresti preoccuparti di quale sia l'elemento successivo perché potrebbe essere una cella di raccolta o meno. Per divertimento, in questo caso, cambiamo il bordo a 2. Questo valore potrebbe essere impostato di default.
  • Quando l'elemento focalizzato successivo è UICollectionViewCell allora hai di gestire la cosa è un modo simile, o diventerà un casino ... Quindi, cambiamo il confine a 5.

Come si può vedere , didUpdateFocusInContext() fornisce un approccio generico per tutte le visualizzazioni all'interno del tuo attuale contesto visivo. È possibile applicare lo stesso approccio per altri elementi dell'interfaccia utente.

Divertiti con tvOS ...

Problemi correlati