【问题标题】:How can I get a specific button running on tvOS (AppleTV) to take focus? (Objective C)如何让在 tvOS (AppleTV) 上运行的特定按钮获得焦点? (目标 C)
【发布时间】:2015-10-01 21:06:54
【问题描述】:

该项目有一些带有不同按钮的视图。当我隐藏一个视图并显示另一个视图时,我无法将焦点放在我的按钮上。

我认为与setNeedsFocusUpdate 有关。我已阅读 Apple 文档。没有任何例子。

有谁知道怎么做并举个例子(目标C)?

【问题讨论】:

标签: objective-c focus tvos


【解决方案1】:

你需要覆盖preferredFocusedView,当你隐藏一个视图并在那里显示时调用这个方法setNeedsFocusUpdate,你的preferredFocusedView实现应该是这样的

- (UIView *)preferredFocusedView
{
    // Add your logic here, it could be more complicated then what is below
    if (view1.hidden)
    {
        return _button;
    }
    else 
    {
        return _button2
    }
}

如果您想让自定义视图获得焦点,请覆盖 canBecomeFocused 方法并返回 true

编辑

您可以使用添加断点并执行此命令po [buttonYouWantToFocus _whyIsThisViewNotFocusable] 它会告诉您为什么它无法聚焦。

【讨论】:

  • 首先,感谢您的快速回复。我有两个子视图(menuView 和 gameView)。当我隐藏 menuView 并显示 gameView 时,gameView 内的按钮没有聚焦。正如你所说,我需要调用方法setNeedsFocusUpdate 。我试图打电话给它,但我什么也没得到。请给我举个例子好吗?
  • 确保您的视图是可聚焦的,而不是隐藏的,并且启用了用户交互
  • @Moloixo 添加断点并在控制台 po [buttonYouWantToFocus _whyIsThisViewNotFocusable] 上执行此命令并告诉我它在说什么
  • 不要覆盖setNeedDisplay,在隐藏和显示视图时调用它
  • 你需要调用[self setNeedFocusUpdate],并在p​​referredFocusedView中添加断点,看看你是否在那里获得控制,
【解决方案2】:

如果您以编程方式添加子视图,也许这就是您想要的:

- (UIView *)preferredFocusedView {
    return [view1 preferredFocusedView];
}

【讨论】:

  • 感谢您的回复,佩尔!
【解决方案3】:

我知道您的问题是针对 Objective-C 的,但这里有一种在 Swift 中解决此问题的方法。您需要覆盖 preferredFocusedView 属性。

override var preferredFocusedView: UIView? {
    guard primaryView.hidden == false else {
        return secondaryView
    }
    return primaryView
}

然后,只要发生导致您的视图被隐藏的事件,只需调用 setNeedsFocusUpdate()。希望这会有所帮助...

【讨论】:

    【解决方案4】:

    另一个选项(如果您不想使用preferredFocusedView)是,不要将视图设置为隐藏,只需将其从其超级视图中删除,如下所示:

    myView.removeFromSuperview()
    

    这会自动将焦点从已移除的按钮上移开,并将其转移给仍在屏幕上的另一个按钮。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多