2015-09-26 13 views
8

To jest rodzaj noobish pytanie, ale po prostu nie mogę znaleźć bardzo prosty sposób, aby wykryć aktualnie koncentruje się na pozycji indexPath.
Rozejrzałem się, mając nadzieję, że coś bardzo łatwego, jak np. collectionView.indexPathOfCurrentlyFocusedItem, ale nie znalazłem niczego blisko. Więc poszperałem i próbowałem znaleźć coś podobnego na UIFocusEnvironment, UIFocusUpdateContext próbując znaleźć żądaną właściwość, ale się nie udało. Jedyne rozwiązanie, jakie mogę wymyślić, to po prostu powtarzanie wszystkich widocznych komórek i znajdowanie komórki z ustawioną właściwością skupioną na wartość true.tvOS UICollectionView uzyskać aktualnie skoncentrowaną ścieżkę indeksu przedmiotu

Czy istnieje prostszy i bardziej elegancki sposób na znalezienie aktualnie skupionego przedmiotu o numerze indexPath? (oprócz śledzenia go przez metody delegata i zapisanie go w nieruchomości widok kontrolera)

Odpowiedz

7

Korzystając didUpdateFocusInContect - UICollectionViewDelegate

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

wil Ta zwrotu indexPath komórki, które będzie się koncentrować, można też spróbować:

context.previouslyFocusedIndexPath 

Zależy od tego, co próbujesz zrobić.

+1

Dzięki za odpowiedź, sam to wymyśliłem. Ale to wymaga mnie do przechowywania nextFocusedIndexPath w nieruchomości, podczas gdy ja chcę coś bardziej wygodne jak 'collectionView.indexPathOfCurrentlyFocusedItem' – xinatanil

+0

jest to możliwa komórka ogniskowania dla konkretnej ścieżki indeksu tj. zapewniamy zakodowaną ścieżkę indeksu – morroko

18

Można użyć UIScreen własność focusedView a następnie do tego:

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

To jest idealna odpowiedź! Dzięki. –

2

Oto jak dokonał tego w shouldUpdateFocusInContext

Rozwiązanie

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

Pracował jak urok. +1 – rottenoats

2

Więc twoim celem jest, aby coś zrobić, gdy tracisz i skupiasz się szczególnie na komórce pod tvOS. Połów jest poruszaniem się wokół innych elementów interfejsu użytkownika, dlatego kontekst może być inny. W tym kontekście musisz zmienić tylko te interfejsy, którymi musisz się zająć.

Prawo miejsce do implementacji jest didUpdateFocusInContext func() w następujący sposób:

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) 
} 

Teraz używamy koordynatora ostrości, aby zastosować naszą logikę:

  • Gdy wcześniej koncentrowały item to UICollectionViewCell, a następnie musisz zwolnić fokus do następnego elementu. Nie powinieneś przejmować się tym, co jest następnym przedmiotem, ponieważ może to być komórka kolekcji lub nie. Dla zabawy, w tym przypadku zmieńmy granicę na 2. Ta wartość może być ustawiona domyślnie.
  • Kiedy następny element jest skupiony UICollectionViewCell wtedy masz obsłużyć to w podobny sposób, lub stanie się bałagan ... Więc zmieńmy granicę do 5.

Jak widać , didUpdateFocusInContext() zapewnia ogólne podejście do wszystkich widoków w bieżącym kontekście wizualnym. Możesz zastosować to samo podejście do innych elementów interfejsu użytkownika.

Baw się dobrze z TVOS ...