如何在tvOS中强制焦点更改到特定视图



我正在实现自定义代码来处理点击Siri遥控器上的菜单按钮。当按下菜单按钮时,如何强制焦点更改为自定义菜单?

对于ios 10,你应该使用preferredFocusEnvironments而不是preferredFocusedView。

在下面的示例中,如果您想关注button,请参阅下面的代码。

@IBOutlet weak var button: UIButton!
override var preferredFocusEnvironments: [UIFocusEnvironment] {
    return [button]
}
override func viewDidLoad() {
    super.viewDidLoad()
    setNeedsFocusUpdate()
    updateFocusIfNeeded()
}

我终于明白了。您必须覆盖UIViewUIViewControllerpreferredFocusedView属性。

在Swift中是这样工作的:

func myClickHandler() {
    someCondition = true
    self.setNeedsFocusUpdate()
    self.updateFocusIfNeeded()
    someCondition = false
}
override weak var preferredFocusedView: UIView? {
    if someCondition {
        return theViewYouWant
    } else {
        return defaultView
    }
}

我不太记得如何在Objective-C中重写getter,所以如果有人想发布,我会编辑答案。

这是基于Slayters上面的答案的另一个实现。我认为这比使用条件布尔值稍微优雅一些。

把这个放到你的视图控制器

var viewToFocus: UIView? = nil {
    didSet {
        if viewToFocus != nil {
            self.setNeedsFocusUpdate();
            self.updateFocusIfNeeded();
        }
    }
}
override weak var preferredFocusedView: UIView? {
    if viewToFocus != nil {
        return viewToFocus;
    } else {
        return super.preferredFocusedView;
    }
}

然后在你的代码中使用

viewToFocus = myUIView;

这里是目标C

- (UIView *)preferredFocusedView
{
    if (someCondition) {
      // this is if your menu is a tableview
        NSIndexPath *ip = [NSIndexPath indexPathForRow:2 inSection:0];
        UITableViewCell * cell = [self.categoryTableView cellForRowAtIndexPath:ip];
        return cell;
    }
    return self.view.preferredFocusedView;
}

在你的viewDidLoad或view确实出现做这样的事情:

    UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
    focusGuide.preferredFocusedView = [self preferredFocusedView];
    [self.view addLayoutGuide:focusGuide];

如果你想在它第一次启动时执行

这是一个漂亮的Swift 2复制/粘贴代码片段:

var myPreferredFocusedView: UIView?
override var preferredFocusedView: UIView? {
    return myPreferredFocusedView
}
func updateFocus(to view: UIView) {
    myPreferredFocusedView = napDoneView
    setNeedsFocusUpdate()
    updateFocusIfNeeded()
}

像这样使用:

updateFocus(to: someAwesomeView)

@elu5ion的答案,但在objective-c首先声明:

@property (nonatomic) UIView *preferredView;

设置这些方法:

-(void)setPreferredView:(UIView *)preferredView{
      if (preferredView != nil) {
         _preferredView = nil;
         UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
         [self.view addLayoutGuide:focusGuide];
         focusGuide.preferredFocusedView = [self preferredFocusedView];
         [self setNeedsFocusUpdate];
         [self updateFocusIfNeeded];
    }
    _preferredView = preferredView;
 }

 - (UIView *)preferredFocusedView {
     if (_preferredView) {
          return _preferredView;
     }
     return self.view.preferredFocusedView;
}

相关内容

  • 没有找到相关文章

最新更新