【问题标题】:How to change focus programmatically in tvOS如何在 tvOS 中以编程方式更改焦点
【发布时间】:2016-05-13 21:00:18
【问题描述】:

我正在快速开发一个 tvOS 应用程序。我在应用程序中使用UITabBarController。 我的要求是在 10 秒后自动隐藏标签栏,并且焦点可以移动到标签栏项目内的AVPlayerViewController。 我试图覆盖preferredFocusedView,但焦点无法移动到AVPlayerViewController

func updateFocus() {

    self.playerController.view.hidden = false
    self.playerController.view.alpha = 1.0
    self.playerController.view.userInteractionEnabled = true
    self.playerController.view.layer.zPosition = 1.0
    self.preferredFocusedView
    setNeedsFocusUpdate()
    updateFocusIfNeeded()
}

override var preferredFocusedView: UIView? {

    return self.playerController.view

}

请建议我如何以编程方式移动焦点。

【问题讨论】:

  • 确保 self.playerController.view.superView 是可聚焦的
  • 抱歉,我返回了 self.playerController.view。
  • 放置一个断点并检查该视图是否从 canBecameFocus 返回 true,您可以通过在控制台上执行此命令来做到这一点 [view _whyIsThisViewNotFocusable]
  • self.playerController.view 是 facusable 因为我向下滑动到远程然后焦点移动到 AVPlayerViewController 但不是以编程方式。
  • 我已经检查了 self.playerController.view.canBecomeFocused() 和它的返回 true 但能够在控制台上执行命令。

标签: swift focus tvos tvos9.1


【解决方案1】:

当时问题是focus 不在viewController 中,而是焦点在tabBarController,所以我建议你做这样的事情, 创建一个TabBarController 子类并将故事板中的tabController 的类设置为该类,然后在tabBarController 子类中执行类似的操作。

  #import "TabBarViewController.h"

    @interface TabBarViewController ()

    @end

    @implementation TabBarViewController

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.tabBar.alpha = 0;
        // set alpha = 1 back again when you need.
    }

    - (UIView*)preferredFocusedView
    {
// you can also add some if else here
        return [self.selectedViewController preferredFocusedView];// or you can do self.selectedViewController.view if that view is focusable
    }

    @end

我在这里选择的视图控制器是 FirstViewController,它看起来像这样并且工作正常。

#import "FirstViewController.h"

@interface FirstViewController ()
@property (weak, nonatomic) IBOutlet UIButton *button;

@end

@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (UIView*)preferredFocusedView
{
    return _button;// return view which you want to make focus able
}
@end

【讨论】:

  • TabBar 在特定时间隐藏,但焦点仍保留在 TabBar 上。
  • 当我在 didSelectViewController 方法中的 TabBarController 类中调用 self.preferredFocusedView 时,它不会更改 AVPlayerViewController 中的焦点。
  • 你不应该直接调用这个方法,它会在启动时自己调用,或者你应该调用setNeedUpdateFocus方法重新查询这个方法
  • preferredFocusedView 已被 ios 10 弃用。你能告诉我如何使用 preferredFocusEnvironments 代替那个。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多