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

Я разрабатываю приложение 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

}

Подскажите, пожалуйста, как программно переместить фокус.


person Vipulk617    schedule 04.02.2016    source источник
comment
убедитесь, что self.playerController.view.superView фокусируется   -  person Adnan Aftab    schedule 04.02.2016
comment
извините, я вернул self.playerController.view.   -  person Vipulk617    schedule 04.02.2016
comment
Поставьте точку останова и проверьте, возвращает ли это представление true из canBecameFocus, вы можете сделать это, выполнив эту команду в консоли [view _whyIsThisViewNotFocusable]   -  person Adnan Aftab    schedule 04.02.2016
comment
self.playerController.view facusable, потому что я прокручиваю вниз до удаленного, а затем фокус перемещаюсь на AVPlayerViewController, но не программно.   -  person Vipulk617    schedule 04.02.2016
comment
Я проверил self.playerController.view.canBecomeFocused(), и он возвращает true, но может выполнять команду на консоли.   -  person Vipulk617    schedule 04.02.2016
comment
@C_X, не могли бы вы помочь мне с этим вопросом. stackoverflow.com/questions/35225205 /   -  person Sankalap Yaduraj Singh    schedule 07.02.2016


Ответы (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
person Adnan Aftab    schedule 04.02.2016
comment
TabBar скрыт в определенное время, но фокус по-прежнему остается на TabBar. - person Vipulk617; 04.02.2016
comment
Когда я вызываю self.preferredFocusedView в классе TabBarController в методе didSelectViewController, он не меняет фокус в AVPlayerViewController. - person Vipulk617; 04.02.2016
comment
вы не должны вызывать этот метод напрямую, он будет вызываться при запуске сам, или вы должны вызвать метод setNeedUpdateFocus, чтобы запросить этот метод - person Adnan Aftab; 04.02.2016
comment
предпочитаемыйFocusedView устарел для ios 10. не могли бы вы рассказать мне, как вместо этого использовать предпочитаемыеFocusEnvironments. - person vikas prajapati; 18.11.2016