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

Так что это немного нубский вопрос, но я просто не могу найти очень простой способ определить indexPath текущего элемента.
Я осмотрелся, надеясь увидеть что-то очень простое, например collectionView.indexPathOfCurrentlyFocusedItem, но не нашел ничего близкого. Поэтому я копался и пытался найти что-то похожее на UIFocusEnvironment, UIFocusUpdateContext пытаясь найти нужное свойство, но безуспешно. Итак, единственное решение, которое я могу придумать, — это просто перебрать все видимые ячейки и найти ячейку со свойством focus, установленным в 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