Как переместить фокус с кнопки на другую в tvOS?

Я новичок в tvOS. Я хотел бы иметь стандартную кнопку, которая при однократном нажатии перемещает фокус на другую стандартную кнопку, как мне это сделать (если это возможно, конечно)?


person Cue    schedule 12.10.2015    source источник


Ответы (2)


Начните с переопределения preferredFocusedView в вашем viewController с помощью пользовательского свойства:

var myPreferredFocusedView:UIView?
override var preferredFocusedView: UIView? {
    return myPreferredFocusedView:UIView
}

Затем в обратном вызове кнопки установите myPreferredFocusedView на следующую предпочтительную кнопку, которая должна получить фокус. После этого напрямую запросите обновление фокуса:

func buttonCallback(){
    myPreferredFocusedView = button2 // button2 is an example 

    /*
        Trigger the focus system to re-query the view hierarchy for preferred
        focused views.
    */
    setNeedsFocusUpdate()
    updateFocusIfNeeded()
}

Это должно обновить систему фокусировки на другую кнопку.

person Antoine    schedule 13.10.2015
comment
Большое спасибо, Антуан. Он работает нормально, единственная проблема, с которой я сталкиваюсь сейчас, заключается в том, что при выходе из представления и затем возвращении фокус теряется, и мне нужно использовать клавиши со стрелками (или перетаскивать на пульте дистанционного управления), чтобы получить любую кнопку для фокусировки. Я постараюсь изучить больше об этом... - person Cue; 14.10.2015
comment
Вы можете использовать тот же код. Просто убедитесь, что вы установили preferredFocusedView и запросили обновление фокуса в viewWillAppear. - person Antoine; 14.10.2015
comment
@Antoine Можете ли вы дать мне идею, чтобы автоматически переместить вкладку фокуса на AVPlayerViewController через 10 секунд программно в tvOS. - person Vipulk617; 04.02.2016
comment
Я попытался переместить вкладку фокуса в AVPlayerViewController, чтобы переопределить метод selectedFocusedView, но не могу перемещаться программно. - person Vipulk617; 04.02.2016

Другой вариант — сделать что-то вроде следующего, когда кнопка A (например) имеет фокус:

buttonB.setNeedsFocusUpdate()
viewController.setNeedsFocusUpdate()

Однако это работает только в том случае, если они находятся на одном уровне в иерархии представлений. Если нет, то вам, вероятно, нужно связать вызовы setNeedsFocusUpdate на всем пути вверх по иерархии или что-то в этом роде...

Подробнее читайте здесь

person CMash    schedule 27.02.2018