Подтвердить что ты не робот

UICollectionViewCell для UIButton Focus в tvOS

У меня есть UICollectionView, который содержит 12-13 UICollectionViewCells. Я легко могу сосредоточиться на UICollectionViewCells, и все работает. Существует UIButton вне UICollectionView. Если я нахожусь в первой ячейке или второй ячейке, и я прокручиваю вверх, то я могу легко сосредоточиться на UIButton. Когда я нахожусь в третьей ячейке, я не могу перенести фокус на UIButton. Любые идеи, что происходит?

введите описание изображения здесь

4b9b3361

Ответ 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]