Ios UICollectionViewCell到电视操作系统中的UIButton焦点

Ios UICollectionViewCell到电视操作系统中的UIButton焦点,ios,tvos,apple-tv,Ios,Tvos,Apple Tv,我有一个UICollectionView,其中包含12-13个UICollectionViewCells。我可以轻松地专注于UICollectionViewCells,一切正常。UICollectionView外有一个UIButton。如果我在第一个单元格或第二个单元格上,并且我向上滑动,那么我可以轻松地将注意力集中在UIButton上。当我在第三个单元格上时,我无法将焦点移动到UIB按钮。知道发生了什么事吗 您应该使用UIFocusGuide,其中包含要聚焦的UIButton。使UIFocus

我有一个UICollectionView,其中包含12-13个UICollectionViewCells。我可以轻松地专注于UICollectionViewCells,一切正常。UICollectionView外有一个UIButton。如果我在第一个单元格或第二个单元格上,并且我向上滑动,那么我可以轻松地将注意力集中在UIButton上。当我在第三个单元格上时,我无法将焦点移动到UIB按钮。知道发生了什么事吗


您应该使用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],
  ]];

Jess Bowers的解决方案就快到了,但是Xcode说,
UIButton
s没有
topAnchor
属性,Jess给出的解决方案对我不起作用

对我来说,解决方案是创建一个与顶部的
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],
  ]];
使用:

覆盖弱var preferredFocusedView:UIView?{ 得到{ 返回分段控制
}}

我面临的一个问题是,在选择某个项目时,使用登录页的UINavigationController将详细视图控制器推送到堆栈上

我在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,在UI按钮的顶部有一个清晰的视图。查看视图时,我发现与iOS不同,iOS的nagivationBar有一个默认的系统背景颜色,tvOS的实现有一个清晰的默认颜色。我意识到我没有隐藏导航栏,作为回报,它阻碍了我的按钮

我做了以下操作,解决了我所有的问题:)


希望这有帮助

Swift 3.0

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

以下是Swift 3和tvOS 10的工作原理。现在必须使用
首选聚焦环境
。在ViewDidLoad()中


UIButton是UIControl的子类,UIControl是UIView的子类。再看看苹果的示例,它在按钮上使用了topAnchor。好的,但Xcode说按钮并没有topAnchor,不幸的是Jess的解决方案对我不起作用。还有一些问题。我只是输入了我的按钮的名称,输入了.top,然后点击escape,自动完成显示了topAnchor。当前Xcode。而且,Jess的解决方案对我也不起作用。我在断点中检查了向导的框架,它看起来是正确的。但它没有效果,这很奇怪。不管怎样,这对我不起作用。是的,这很奇怪。我已经用过很多次了。UIButton肯定有一个主播。可能有一些特定的和不同的设置。在问题中发布更多代码可能会有所帮助,我很乐意给出反馈。我所做的某些假设可能不适用于你的情况。UIFocusGuide和layout guide旨在消除对虚拟视图的需求,就像您在那里看到的那样。但它们确实有用。谢谢杰西——这让我发疯了。请注意,如果使用此视图时遇到问题,则可能是因为您的一个定位点嵌入到另一个视图中。我在滚动视图中有一个集合视图,使用集合视图底部作为我的顶部锚点不起作用。将此更改为滚动视图底部有效。效果非常好!谢谢。嗨,杰斯,我还有一个问题。若我在右边而不是左边有按钮,若我只有一行集合视图,我就不能使集合视图聚焦。有什么解决办法吗?@Vijay_07这可能值得打开一个新的堆栈问题。不太清楚。
navController.setNavigationBarHidden(true, animated: false)
        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]