2015-09-26 18 views
8

これは一種の問題ですが、現在フォーカスのあるアイテムのindexPathを検出する簡単な方法はわかりません。
collectionView.indexPathOfCurrentlyFocusedItemのような非常に簡単なものを見たいと思っていましたが、遠隔で何も見つけられませんでした。 私は掘り起こして、UIFocusEnvironmentUIFocusUpdateContextで類似のものを見つけようとしましたが、目的のプロパティを見つけようとしましたが失敗しました。 私が思いつくことができる唯一の解決策は、すべての目に見えるセルを繰り返し、フォーカスされたプロパティを持つセルを真に設定することです。tvOS UICollectionViewは現在フォーカスされているアイテムのインデックスパスを取得します

現在フォーカスのある商品のindexPathを見つけるには、よりシンプルでエレガントな方法がありますか? (デリゲートメソッドを介してそれを追跡し、ビューコントローラのプロパティでそれを保存除く)

答えて

7

使用didUpdateFocusInContect - UICollectionViewDelegate

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

これは集中しようとしているセルのindexPathを返すウィル、あなたも試みることができます:

context.previouslyFocusedIndexPath 

何をしようとしているかによって異なります。

このために以下のようにあなたが UIScreenプロパティ focusedViewを使用することができます
+1

感謝を楽しんで、私はこの1つを自分で考え出しました。しかしこれには、nextFocusedIndexPathをプロパティに格納する必要がありますが、collectionViewのようにもっと便利なものが必要です。indexPathOfCurrentlyFocusedItem' – xinatanil

+0

は、特定のインデックスパスに対して可能なフォーカスセルです。つまり、ハードコードされたインデックスパスを提供します。 – morroko

18

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

これは完璧な答えです!ありがとう。 –

2

は、ここで私は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 
} 
+0

チャームのように働いた。 +1 – rottenoats

2

だから、あなたの目標は、ときに何かを行うことですとりわけtvOSの下では、セルにフォーカスを失います。このキャッチは他のUI要素を移動しているため、コンテキストが異なる可能性があります。このコンテキストでは、気にする必要のあるUIのみを変更する必要があります。以前に焦点を当てたとき

  • :今

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

    私達は私達のロジックを適用するために、フォーカス調整を使用している:

    実装を作るために適切な場所では、このようにfunc didUpdateFocusInContext()であり、 itemがUICollectionViewCellの場合、フォーカスを次のアイテムに解放する必要があります。次のアイテムはコレクションセルであるかどうかに関わらず気にしないでください。この場合、ボーダーを2に変更してみましょう。この値はデフォルトで設定できます。だから、あなたが見ることができるようにのは5

に境界線を変更してみましょう...

  • 次のフォーカスがあるアイテムがUICollectionViewCellある場合は、あなたがそれを処理するためにきましたが、同様の方法である、またはそれが混乱になるだろう、didUpdateFocusInContext()は、現在のビジュアルコンテキスト内のすべてのビューに対する一般的なアプローチを提供します。他のUI要素に対しても同じアプローチを適用できます。

    が... tvOSで答えを