Я использую специальный код для обработки щелчка по кнопке меню на Siri Remote. Как я могу заставить фокус переключиться на свое пользовательское меню при нажатии кнопки меню?
Как я могу заставить фокус перейти на конкретный вид в tvOS?
Ответ 1
Наконец-то разобрался сам. Вы должны переопределить свойство preferredFocusedView
вашего UIView
или 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, поэтому, если кто-то захочет опубликовать это, я отредактирую ответ.
Ответ 2
Для ios 10 вы должны использовать preferredFocusEnvironments вместо предпочтительногоFocusedView.
В приведенном ниже примере, если вы хотите сфокусироваться на btnEnglish, см. ниже код.
@IBOutlet weak var btnEnglish:UIButton!
override var preferredFocusEnvironments : [UIFocusEnvironment] {
//condition
return [btnEnglish]
}
override func viewDidLoad() {
super.viewDidLoad()
self.setNeedsFocusUpdate()
self.updateFocusIfNeeded()
}
Ответ 3
Вот еще одна реализация, основанная на ответе 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;
Ответ 4
вот цель 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;
}
в вашем представленииDidLoad или просмотр действительно отображались примерно так:
UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
focusGuide.preferredFocusedView = [self preferredFocusedView];
[self.view addLayoutGuide:focusGuide];
если вы хотите сделать это при первом запуске
Ответ 5
@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;
}
Ответ 6
Вот хороший фрагмент скопирования/вставки Swift 2:
var myPreferredFocusedView: UIView?
override var preferredFocusedView: UIView? {
return myPreferredFocusedView
}
func updateFocus(to view: UIView) {
myPreferredFocusedView = napDoneView
setNeedsFocusUpdate()
updateFocusIfNeeded()
}
Используйте его следующим образом:
updateFocus(to: someAwesomeView)