TvOS UITabBarController обнаруживает отображаемую/скрытую вкладку

Можно ли каким-либо образом определить, появится или исчезнет панель вкладок UITabBarController? Я хочу сделать анимацию одновременно с анимацией, которая показывает/скрывает панель вкладок.

Я не нашел способа обнаружить это событие. Свойство «скрытый» панели вкладок не является опцией, поскольку оно меняет свое значение после завершения анимации.


person rai212    schedule 03.02.2016    source источник
comment
Вы можете использовать viewController's viewWillAppear, чтобы обнаружить, что вкладка изменится. И вы можете отправить уведомление или использовать делегата, чтобы обнаружить его в своем UITabBarController.   -  person Mihriban Minaz    schedule 03.02.2016
comment
Но в TvOS можно отобразить панель вкладок, не меняя контроллер представления (просто нажав кнопку меню или выбрав удаленный трекпад), и в этом случае я не смогу обнаружить, что отображается панель вкладок.   -  person rai212    schedule 03.02.2016


Ответы (1)


Решение состояло в том, чтобы использовать метод в контроллере представления didUpdateFocusInContext:withAnimationCoordinator: с этим кодом:

static NSString *kUITabBarButtonClassName = @"UITabBarButton";

NSString *prevFocusViewClassName = NSStringFromClass([context.previouslyFocusedView class]);
    NSString *nextFocusedView = NSStringFromClass([context.nextFocusedView class]);

    // The tabbar is going to disappear
    if ([prevFocusViewClassName isEqualToString:kUITabBarButtonClassName] &&
        ![nextFocusedView isEqualToString:kUITabBarButtonClassName]) {
        [self.view layoutIfNeeded];
        self.constraintScrollViewCenterY.constant -= self.tabBarController.tabBar.frame.size.height;

        [coordinator addCoordinatedAnimations:^{
            [self.view layoutIfNeeded];
        } completion:nil];
    // The tabbar is going to appear
    } else if (![prevFocusViewClassName isEqualToString:kUITabBarButtonClassName] &&
               [nextFocusedView isEqualToString:kUITabBarButtonClassName]) {
        [self.view layoutIfNeeded];
        self.constraintScrollViewCenterY.constant += self.tabBarController.tabBar.frame.size.height;

        [coordinator addCoordinatedAnimations:^{
            [self.view layoutIfNeeded];
        } completion:nil];
    }

где self.constraintScrollViewCenterY — это ограничение, связанное с вертикальным выравниванием представления, которое я хочу переместить в соответствии с движением панели вкладок.

Примечание. Использование имени класса (kUITabBarButtonClassName) вместо метода [... class] связано с тем, что UITabBarButton является закрытым классом.

person rai212    schedule 03.02.2016
comment
У меня есть несколько контроллеров представления для моей панели вкладок. Это означало бы, что мне пришлось бы писать этот код в каждом из контроллеров представления. - person Ganesh Somani; 17.02.2016
comment
Да, вы должны использовать этот код во всех контроллерах представления. Возможно, вы могли бы использовать базовый класс с этим кодом, от которого наследуется - person rai212; 18.02.2016