2015-09-26 18 views
8

Vì vậy đây là một câu hỏi khó hiểu nhưng tôi không thể tìm ra cách đơn giản để phát hiện mục indexPath của mục hiện đang tập trung.
Tôi nhìn xung quanh với hy vọng sẽ thấy một cái gì đó rất dễ dàng như collectionView.indexPathOfCurrentlyFocusedItem nhưng không tìm thấy bất cứ điều gì từ xa gần. Vì vậy, tôi tìm hiểu và cố gắng tìm một cái gì đó tương tự tại UIFocusEnvironment, UIFocusUpdateContext cố gắng tìm thuộc tính mong muốn nhưng không thành công. Vì vậy, giải pháp duy nhất tôi có thể đưa ra là chỉ lặp qua tất cả các ô hiển thị và tìm một ô có thuộc tính tập trung được đặt thành true.tvOS UICollectionView lấy đường dẫn chỉ mục của mục đang tập trung

Vì vậy, có cách đơn giản và thanh lịch hơn để tìm mục hiện đang tập trung indexPath? (Trừ theo dõi nó thông qua phương pháp đại biểu và lưu nó trong bất động sản xem điều khiển của)

Trả lời

7

Sử dụng didUpdateFocusInContect - UICollectionViewDelegate

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

này wil trả lại indexPath của tế bào có nghĩa là sẽ được tập trung, bạn cũng có thể thử:

context.previouslyFocusedIndexPath 

Phụ thuộc vào những gì bạn đang cố gắng làm.

+1

Cảm ơn câu trả lời, tôi đã tự mình tìm ra câu trả lời này. Nhưng điều này đòi hỏi tôi phải lưu trữ nextFocusedIndexPath trong một thuộc tính, trong khi tôi muốn một cái gì đó thuận tiện hơn như 'collectionView.indexPathOfCurrentlyFocusedItem' – xinatanil

+0

là ô tiêu điểm có thể có này cho đường dẫn chỉ mục cụ thể tức là chúng tôi cung cấp đường dẫn chỉ mục được mã hóa cứng – morroko

18

Bạn có thể sử dụng UIScreen tài sản focusedView như sau cho việc này:

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

Đây là câu trả lời hoàn hảo! Cảm ơn người đàn ông. –

2

Đây là cách tôi thực hiện điều này trong shouldUpdateFocusInContext

Giải pháp

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

Làm việc như một sự quyến rũ. +1 – rottenoats

2

Vì vậy, mục tiêu của bạn là để làm một cái gì đó khi bạn nhận được và mất tập trung đặc biệt vào một tế bào dưới tvOS. Việc nắm bắt là bạn đang di chuyển xung quanh các phần tử giao diện người dùng khác và do đó ngữ cảnh có thể khác nhau. Bạn phải thay đổi trong bối cảnh này chỉ những UI mà bạn phải quan tâm.

Nơi quyền thực hiện thực hiện của bạn là func didUpdateFocusInContext(), như thế này:

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

Bây giờ chúng ta đang sử dụng các điều phối viên tập trung để áp dụng logic của chúng tôi:

  • Khi trọng tâm trước đó item là UICollectionViewCell thì bạn phải giải phóng tiêu điểm cho mục tiếp theo. Bạn không nên quan tâm mục tiếp theo là gì vì nó có thể là một ô thu thập hay không. Để giải trí, trong trường hợp này, hãy thay đổi đường viền thành 2. Giá trị này có thể được đặt theo mặc định.
  • Khi mục đã tập trung tiếp theo là UICollectionViewCell sau đó bạn đã để xử lý nó là một cách tương tự, hoặc nó sẽ trở thành một mớ hỗn độn ... Vì vậy, hãy thay đổi biên giới để 5.

Như bạn có thể nhìn thấy , didUpdateFocusInContext() cung cấp một cách tiếp cận chung cho tất cả các khung nhìn trong ngữ cảnh trực quan hiện tại của bạn. Bạn có thể áp dụng cùng một cách tiếp cận cho các phần tử giao diện người dùng khác.

Hãy vui vẻ với tvOS ...

Các vấn đề liên quan