2015-09-26 119 views
8

所以這是一個不太清的問題,但我無法弄清楚一個非常簡單的方法來檢測當前焦點物品的indexPath
我環顧四周希望看到一些非常簡單的東西,如collectionView.indexPathOfCurrentlyFocusedItem,但沒有發現任何遠程關閉。 所以我四處尋找,並試圖找到類似的東西UIFocusEnvironment,UIFocusUpdateContext試圖找到所需的屬性,但失敗。 所以,我能想出的唯一解決方案就是遍歷所有可見單元格,並找到一個將焦點屬性設置爲true的單元格。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 

取決於你想要做的事情。

+1

感謝您的答案,我自己想出了這一個。但是這需要我將nextFocusedIndexPath存儲在一個屬性中,而我希望像'collectionView一樣更方便。indexPathOfCurrentlyFocusedItem' – xinatanil

+0

是特定索引路徑的可能焦點單元格,即我們提供硬編碼索引路徑 – morroko

18

可以使用UIScreen財產focusedView作爲遵循這樣的:

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。

,讓您實現正確的地方是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()爲您當前的可視上下文中的所有視圖提供了一種通用方法。您可以對其他UI元素應用相同的方法。

玩得開心tvOS ...