UICollectionViewCell到UIButton专注于tvOS

时间:2015-10-20 15:00:11

标签: ios tvos apple-tv

我有一个UICollectionView,它包含12-13个UICollectionViewCells。我可以轻松专注于UICollectionViewCells,一切正常。 UICollectionView外面有一个UIButton。如果我在第一个细胞或第二个细胞上,我向上滑动,那么我可以轻松地专注于UIButton。当我在第三个单元格上时,我无法将焦点移动到UIButton。有什么想法发生了什么?

enter image description here

5 个答案:

答案 0 :(得分:14)

您应该使用包含您要关注的UIButton的UIFocusGuide。使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],
  ]];

答案 1 :(得分:2)

Jess Bowers解决方案几乎就在那里,但Xcode说UIButton s没有topAnchor属性,Jess给出的解决方案对我不起作用。

对我来说,解决方案是创建一个巨大的视图,其宽度与UICollectionView之上的宽度相同。见图。

enter image description here

代码将是:

 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],
  ]];

答案 2 :(得分:0)

使用:

覆盖弱var preferredFocusedView:UIView? {    得到{ return segmentedControl     }}

答案 3 :(得分:0)

我遇到的一个问题涉及使用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 ???

我在视觉调试器中快速打开了UI,在我的UIButton顶部有一个清晰的视图。检查视图我发现 iOS不同,nagivationBar具有默认的系统背景颜色,tvOS的实现具有明确的默认颜色。我意识到我没有隐藏导航栏,作为回报,它阻碍了我的按钮。

我做了以下事情,并修复了我的所有问题:)

navController.setNavigationBarHidden(true, animated: false)

希望这有帮助!!!

答案 4 :(得分:0)

Swift 3.0

Jess Bower的回答对我有很大的帮助。节省了很多时间。

这适用于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]