2016-02-17 4 views
0

В моем приложении tvOS у меня есть TabBarController с 3 viewControllers. Я хочу, чтобы автоматически скрыть/изменить фокус tabBar, когда я переключаюсь на следующий viewController.Как скрыть TabBar, чтобы скрыть его в приложении tvOS?

Я видел несколько сообщений здесь, на SO, которые предложили изменить alfa на tabBar, но я бы хотел, чтобы анимация слайдов была такой же, как при изменении фокуса на что-то в viewController.

Любая помощь очень ценится.

+0

Вы можете попробовать это https://stackoverflow.com/questions/35197806/how-to-change-focus-programmatically-in -tvos – vipulk617

ответ

0

Основная идея решения, описанного ниже подкласс UITabBarController и избирательно использовать super реализацию weak var preferredFocusedView: UIView? { get } или тот, который возвращает selectedViewController?.preferredFocusView наряду с реализацией didUpdateFocusInContext(_:withAnimationCoordinator:), который устанавливает в NSTimer, который запускает обновление фокусировки и устанавливает флаг, управляет реализацией preferredFocusView.

Более подробно, Подкласс UITabBarController и переопределить didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator). В вашей реализации (убедитесь, что вы вызываете реализацию super) вы можете проверить контекст и определить, является ли представление потомка свойства tabBar значением nextFocusedView или previousFocusedViewnextFocusedView не является потомком).

Если панель вкладок набирает фокус, вы можете создать NSTimer на время, которое вы хотите показать панель вкладок, прежде чем спрятать его. Если панель вкладок теряет фокус до срабатывания таймера, аннулируйте его. Если таймер срабатывает, вызовите setNeedsFocusUpdate(), а затем updateFocusIfNeeded().

Последний элемент, который вам нужен для работы, - это флаг, установленный на true, когда установлен таймер. Затем вам необходимо переопределить weak var preferredFocusedView: UIView? { get } и вызвать реализацию super, если флаг равен false, и если это true return selectedViewController?.preferredFocusedView.

+0

Не могли бы вы дать мне код для лучшего обзора? Прошу – Saty

1

Как сказал Чарльз .. Что-то вроде этого в производном UITabBarController:

var focusOnChildVC : Bool = false { 
    didSet { 
     self.setNeedsFocusUpdate() 
    } 
}; 


override weak var preferredFocusedView: UIView? { 
    get { 
     let v : UIView?; 

     let focused = UIScreen.mainScreen().focusedView 

     //A bit of a hack but seems to work for picking up whether the VC is active or not 
     if (focusOnChildVC && focused != nil) { 
      v = self.selectedViewController?.preferredFocusedView 
     } else { 
      //If we are focused on the main VC and then clear out of property as we're done with overriding the focus now 
      if (focusOnChildVC) { 
       focusOnChildVC = false 
      }     
      v = super.preferredFocusedView; 
     } 
     return v 
    } 
}