2015-11-21 2 views
5

Хорошо, если у меня есть UIViewController Я могу сделать просмотр сфокусированным на tvOS, если я использую этот `preferredFocusedView, но как насчет того, чтобы сфокусировать первую ячейку UICollectionView? Как мне это сделать?Создание первой ячейки UICollectionView, сфокусированной на tvOS

Я попытался создать подкласс UICollectionViewCell и есть метод

- (UIView *)preferredFocusedView { 
    return ([self ifThisIsTheFirstCell]) ? self : nil; 
} 

без успеха.

Есть ли способ сделать это?

ответ

8

Путь «предпочтительный фокус» работает концептуально является то, что есть «цепь» из объекты, начиная с окна вашего приложения, спускаются через контроллеры и представления, пока цепочка не закончится с фокусным видом. Этот взгляд в конце - это то, что будет сфокусировано, когда ваше приложение запустится, или если фокус нужно сбросить (например, если текущее фокусное изображение будет удалено из иерархии представлений, UIKit нужно будет выбрать другое представление, чтобы стать сфокусированным) , Метод preferredFocusedView - это то, как вы определяете цепочку.

Например, UIWindow реализует preferredFocusedView, чтобы вернуть предпочтительный сфокусированный вид rootViewController. В реферате, т делает что-то вроде этого:

- (UIView *)preferredFocusedView { 
    return [self.rootViewController preferredFocusedView]; 
} 

UIViewController реализует preferredFocusedView вернуть его view собственность. UIView просто возвращается сам.

Однако UICollectionView реализует preferredFocusedView по-разному: в простейшем случае он возвращает первую ячейку. Так что часть того, что вы хотите, уже сделано для вас. Если фокус не перемещается в первую ячейку вашей коллекции, то проблема в цепочке выше.

Если вид коллекции вашего взгляда контроллер не view свойства контроллера представления, то вам необходимо направить фокус цепь в коллекции себе:

// in your view controller: 
- (UIView *)preferredFocusedView { 
    return myCollectionView; 
} 

Оттуда вид коллекции направьте цепь в конкретную ячейку.

+3

Теперь мы говорим. Интересно, почему Apple никогда не нанимает таких людей, как вы, чтобы написать свою документацию. Вместо этого они пишут людей, которые ненавидят писать. ИДЕАЛЬНО! БЛАГОДАРЯ! – SpaceDog

+0

Если вы извлекаете данные из некоторого сервиса, не забудьте написать [self setNeedsFocusUpdate]; после команды reloadData/reloadSection. – NaXir

+0

Любое руководство по программной настройке, какая ячейка сосредоточена в виде коллекции? – vtcajones

-1

Вам нужно добавить этот метод UICollectionViewDelegate и никакой логики требуется, если вы не хотите, чтобы вернуться верно в некоторых случаях

func collectionView(collectionView: UICollectionView, shouldUpdateFocusInContext context: UICollectionViewFocusUpdateContext) -> Bool { 
    return true 
    } 
+0

У меня есть этот метод на месте, но теперь не могу сосредоточиться клетка? – SpaceDog

+0

Вы спрашиваете, как сфокусировать «конкретную» ячейку? В вашем вопросе говорится «первая ячейка». Вышеуказанный метод в моем приложении фокусирует первую ячейку. Но если у вас есть несколько фокусируемых элементов в вашем представлении, может потребоваться другое решение. – earthtrip

+0

нет, я имею в виду первую ячейку. По какой-то причине это не работает для меня. Кстати, почему этот метод работает, если в нем нет ничего, упоминающего первую ячейку? Я не уверен, хорошо ли я объясняю себя.Я хочу: появляется CollectionViewController, и первая ячейка сфокусирована (я имею в виду огромный размер, поскольку сфокусированная ячейка должна быть в tvOS). – SpaceDog

0

Вы можете использовать этот метод, Apple documentation

func indexPathForPreferredFocusedView(in collectionView: UICollectionView) -> IndexPath? { 
    return IndexPath(item: self.datasourceArray.count, section: 0) 
} 

Вы можете вернуть любой indexPath вы хотите ..

, например IndexPath(item: 0, section: 0)

Смежные вопросы