我正在实现自定义代码来处理Siri Remote上菜单按钮的点击。 按菜单按钮时,如何强制焦点更改为自定义菜单?
答案 0 :(得分:19)
终于把它弄清楚了。您必须覆盖preferredFoucsedView
或UIView
。{/ p>的UIViewController
属性
在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,所以如果有人想发帖,我会编辑答案。
答案 1 :(得分:15)
这是基于Slayters上面的答案的另一个实现。我认为它比使用条件布尔值更优雅。
将它放在你的viewcontroller中
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;
答案 2 :(得分:15)
对于ios 10,您应该使用preferredFocusEnvironments而不是preferredFocusedView。
在下面的示例中,如果您想关注btnEnglish,请参阅下面的代码。
<code class="language-html">...</code>
答案 3 :(得分:5)
这是目标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或视图中的确实显示如下:
UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
focusGuide.preferredFocusedView = [self preferredFocusedView];
[self.view addLayoutGuide:focusGuide];
如果您想在首次启动时执行此操作
答案 4 :(得分:0)
@ 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;
}
答案 5 :(得分:0)
这是一个很好的小Swift 2复制/粘贴片段:
var myPreferredFocusedView: UIView?
override var preferredFocusedView: UIView? {
return myPreferredFocusedView
}
func updateFocus(to view: UIView) {
myPreferredFocusedView = napDoneView
setNeedsFocusUpdate()
updateFocusIfNeeded()
}
像这样使用:
updateFocus(to: someAwesomeView)