UICollectionViewCell для UIButton Focus в tvOS
У меня есть UICollectionView, который содержит 12-13 UICollectionViewCells. Я легко могу сосредоточиться на UICollectionViewCells, и все работает. Существует UIButton вне UICollectionView. Если я нахожусь в первой ячейке или второй ячейке, и я прокручиваю вверх, то я могу легко сосредоточиться на UIButton. Когда я нахожусь в третьей ячейке, я не могу перенести фокус на UIButton. Любые идеи, что происходит?
![введите описание изображения здесь]()
Ответы
Ответ 1
Вы должны использовать UIFocusGuide, который включает UIButton, который вы хотите сфокусировать. Сделайте UIFocusGuide столь же широким, как collectionView, и достаточно высок, чтобы накрыть кнопку. Сделайте preferredFocusView кнопкой.
UIFocusGuide *topButtonFocusGuide = [[UIFocusGuide alloc] init];
topButtonFocusGuide.preferredFocusedView = myButton;
[self.view addLayoutGuide:topButtonFocusGuide];
[self.view addConstraints:@[
[topButtonFocusGuide.topAnchor constraintEqualToAnchor:myButton.topAnchor],
[topButtonFocusGuide.bottomAnchor constraintEqualToAnchor:myCollectionView.topAnchor],
[topButtonFocusGuide.leadingAnchor constraintEqualToAnchor:myCollectionView.leadingAnchor],
[topButtonFocusGuide.widthAnchor constraintEqualToAnchor:myCollectionView.widthAnchor],
]];
Ответ 2
Решение Джесс Бауэрс почти существует, но Xcode говорит, что UIButton
не имеет свойства topAnchor
, и решение, данное Джессом, не работает для меня.
Для меня решение заключалось в создании огромного представления с той же шириной, что и UICollectionView
поверх него. См. Рисунок.
![введите описание изображения здесь]()
Код будет следующим:
UIFocusGuide *topButtonFocusGuide = [[UIFocusGuide alloc] init];
topButtonFocusGuide.preferredFocusedView = myButton;
[self.view addLayoutGuide:topButtonFocusGuide];
[self.view addConstraints:@[
[topButtonFocusGuide.topAnchor constraintEqualToAnchor:transparentView.topAnchor],
[topButtonFocusGuide.bottomAnchor constraintEqualToAnchor:transparentView.bottomAnchor],
[topButtonFocusGuide.leadingAnchor constraintEqualToAnchor:transparentView.leadingAnchor],
[topButtonFocusGuide.widthAnchor constraintEqualToAnchor:transparentView.widthAnchor],
]];
Ответ 3
Использование:
переопределить слабый var preferredFocusedView: UIView? { получить {
return segmentedControl }}
Ответ 4
Одна из проблем, с которыми я столкнулась, связана с использованием UINavigationController для целевых страниц, чтобы вытащить детали ViewControllers в стек при выборе элемента.
Я установил точку останова в переопределении UIButton canBecomeFocused, и, используя это быстрое небольшое расширение, попросил кнопку, почему она не фокусируется.
extension UIView {
func whyNotFucusable () {
print(self.perform(Selector(("_whyIsThisViewNotFocusable"))).takeUnretainedValue())
}
}
Я продолжал получать следующую ошибку, пытающуюся отлаживать....
ISSUE: This view may not be focusable because other views or focus guides are occluding it.
Прежде всего, я искал в словаре то, что означало закрытие черта....
verb, formal, technical
- stop, close up, or obstruct (an opening, orifice, or passage).
Теперь вопрос в том, какой взгляд препятствует моему UIButton???
Я быстро развернул пользовательский интерфейс в визуальном отладчике, и на вершине моих UIButtons появился ясный вид. Осмотрев представление, я обнаружил, что В отличие от iOS, где nagivationBar имеет цвет фона системы по умолчанию, реализация tvOS имеет чистый цвет по умолчанию. Я понял, что я не скрывал навигационную панель, а в свою очередь это мешало моим кнопкам.
Я сделал следующее, и он исправил все мои проблемы:)
navController.setNavigationBarHidden(true, animated: false)
Надеюсь, это поможет!!!
Ответ 5
Swift 3.0
Ответ Джесса Бауэра был огромной помощью для меня и сэкономил много времени.
Здесь то, что работало с Swift 3 и tvOS 10. Теперь нужно использовать preferredFocusEnvironments
. В ViewDidLoad()
self.view.addLayoutGuide(focusGuide)
self.focusGuide.topAnchor.constraint(equalTo: self.buttonAbove.topAnchor).isActive = true
self.focusGuide.bottomAnchor.constraint(equalTo: self.CollectionView.topAnchor).isActive = true
self.focusGuide.leadingAnchor.constraint(equalTo: self.CollectionView.leadingAnchor).isActive = true
self.focusGuide.widthAnchor.constraint(equalTo: self.CollectionView.widthAnchor).isActive = true
self.focusGuide.preferredFocusEnvironments = [self.buttonAbove]