tvOS UICollectionView получава пътя на индекса на текущо фокусирания елемент

Така че това е малко глупав въпрос, но просто не мога да разбера много прост начин за откриване на текущо фокусирания елемент indexPath.
Огледах се наоколо с надеждата да видя нещо много лесно като collectionView.indexPathOfCurrentlyFocusedItem, но не намерих нищо далечно близко. Затова се разрових и се опитах да намеря нещо подобно на UIFocusEnvironment, UIFocusUpdateContext, опитвайки се да намеря желания имот, но не успях. Така че единственото решение, което мога да измисля, е просто итерация през всички видими клетки и намиране на клетка с фокусирано свойство, зададено на true.

И така, има ли по-прост и елегантен начин да намерите indexPath на текущо фокусирания елемент? (С изключение на проследяването му чрез метод на делегиране и запазването му в свойството на контролера за изглед)


person xinatanil    schedule 26.09.2015    source източник


Отговори (4)


Можете да използвате UIScreen свойство focusedView както следва за това:

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

Използвайте didUpdateFocusInContect - UICollectionViewDelegate

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

Това ще върне indexPath на клетката, която ще бъде фокусирана, можете също да опитате:

context.previouslyFocusedIndexPath

Зависи какво се опитвате да направите.

person Jeroen Bakker    schedule 28.09.2015
comment
Благодаря за отговора, това го измислих сам. Но това изисква да съхранявам nextFocusedIndexPath в свойство, докато искам нещо по-удобно като collectionView.indexPathOfCurrentlyFocusedItem - person xinatanil; 09.10.2015
comment
е тази възможна фокусна клетка за определен път на индекс, т.е. ние предоставяме твърдо кодиран път на индекс - person Gajendra Rawat; 15.03.2016

Така че целта ви е да направите нещо, когато получите или загубите фокус, особено върху клетка под tvOS. Уловката е, че се движите около други елементи на потребителския интерфейс и следователно контекстът може да е различен. В този контекст трябва да промените само тези потребителски интерфейси, за които трябва да се грижите.

Правилното място за внедряване е func didUpdateFocusInContext(), като това:

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

Сега използваме координатора на фокуса, за да приложим нашата логика:

  • Когато предишният фокусиран елемент е UICollectionViewCell, тогава трябва да освободите фокуса към следващия елемент. Не трябва да ви интересува кой е следващият елемент, защото може да е колекторна клетка или не. За забавление, в този случай, нека променим границата на 2. Тази стойност може да бъде зададена по подразбиране.
  • Когато следващият фокусиран елемент е UICollectionViewCell, тогава трябва да се справите с него по подобен начин или ще стане бъркотия... Така че, нека променим границата на 5.

Както можете да видите, didUpdateFocusInContext() предоставя общ подход за всички изгледи в текущия ви визуален контекст. Можете да приложите същия подход за други елементи на потребителския интерфейс.

Забавлявайте се с tvOS...

person Andrew Andreev    schedule 05.06.2016

Ето как постигнах това в shouldUpdateFocusInContext

Решение

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
}
person Jacksonkr    schedule 09.11.2015
comment
Работи като чар. +1 - person kemicofa ghost; 02.09.2016