Подтвердить что ты не робот

Скрытие TabBar при повороте устройства iPhone в альбом

Итак, вот что я имею: UITabBarController, который обрабатывает различные UIViewControllers. В одном из UIViewController я пытаюсь переключить отображение, отображаемое, когда устройство поворачивается в альбомное. важная часть состоит в том, что отображаемый в ландшафте вид ДОЛЖЕН принимать весь экран...

Я правильно реализовал методы:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

На самом деле, у меня действительно правильное вращение, и мои взгляды изменились. я даже скрываю строку состояния, навигационную панель и панель вкладок. НО я продолжаю иметь пустое место в нижней части экрана, которое является местом TabBar...

Поэтому я предполагаю, что для скрытого свойства tabBar недостаточно просмотра всего экрана. Я думаю, что в TabBarController или даже MainWindow есть что-то, что нужно сделать, например: "Мне теперь не нужен TabBarController". Но я не вижу, как правильно решить эту проблему.

Если кто-то был вокруг этой проблемы, я был бы признателен за помощь.

Благодарю вас, Сами.

4b9b3361

Ответ 1

Это сработало для меня.


- (void)viewDidLoad {
    [super viewDidLoad];    
    previousRect = self.view.frame; 
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
{
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {       
        [self.navigationController setNavigationBarHidden:TRUE animated:FALSE]; 
        [[UIApplication sharedApplication] setStatusBarHidden:TRUE animated:FALSE];
    }
    else
    {
        [self.navigationController setNavigationBarHidden:FALSE animated:FALSE];
        [[UIApplication sharedApplication] setStatusBarHidden:FALSE animated:FALSE];
    }
}

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    UIInterfaceOrientation toOrientation = self.interfaceOrientation;

    if ( self.tabBarController.view.subviews.count >= 2 )
    {
        UIView *transView = [self.tabBarController.view.subviews objectAtIndex:0];
        UIView *tabBar = [self.tabBarController.view.subviews objectAtIndex:1];

        if(toOrientation == UIInterfaceOrientationLandscapeLeft || toOrientation == UIInterfaceOrientationLandscapeRight) {                 
            transView.frame = CGRectMake(0, 0, 480, 320 );
            tabBar.hidden = TRUE;
        }
        else
        {               
            transView.frame = previousRect;     
            tabBar.hidden = FALSE;
        }
    }
}

Ответ 2

  • В приведенном выше решении для меня слишком мало изменений для iOS6 и выше:
  • в iOS6 удалите строку: "previousRect = self.view.frame;"
  • также заменить "animated:" на "withAnimation:"
  • и удалите "transView.frame = предыдущий", снизу (в функции else)
  • Это работает для меня таким образом. И большое спасибо пользователю UB.

Ответ 3

Этот код работает нормально, но когда я увольняю uiviewcontroller, который представлен модально, мое представление находится в строке состояния на 20 пикселей. Мой взгляд внутри навигационного контроллера, поэтому я не скрываю его перед вращением.

Ответ 4

Мне нужна панель вкладок, чтобы перейти в полноэкранный режим в альбомном режиме, и я попробовал предложенный выше подход, используя

transView.frame = CGRectMake(0, 0, 480, 320 );

Это оказалось хакерским решением и поставило много проблем, таких как скрытие и повторное отображение строки состояния (представление будет перекрываться со строкой состояния, когда оно будет повторно отображаться после выхода из книжного вида). Я бы не рекомендовал этого. То, что отлично сработало для меня, - это толкать новый контроллер представлений, содержащий ландшафтный вид, и использовать делегацию для повторного использования функциональности исходного VC.

Ответ 5

Этот подход работает для меня:

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    UIView *parentView = self.tabBarController.view;
    CGRect frame = parentView.frame;
    CGFloat windowHeight = parentView.window.frame.size.height;

    switch (toInterfaceOrientation) {
        case UIInterfaceOrientationLandscapeLeft:
        case UIInterfaceOrientationLandscapeRight:
            CGFloat tabBarHeight = self.tabBarController.tabBar.frame.size.height;
            frame.size.height = windowHeight + tabBarHeight;
            break;
        default:
            frame.size.height = windowHeight;
            break;
    }

    [UIView animateWithDuration:duration animations:^{
        parentView.frame = frame;
    }];
}

(проверяется только в iOS8.)

Ответ 6

Подкласс вашего TabBarController и скрыть TabBar при необходимости:

class tabBarVC: UITabBarController {

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        if size.height < size.width {
            self.tabBar.hidden = true
        } else {
            self.tabBar.hidden = false
        }
    }

}

Ответ 7

Возможно, вы хотите использовать этот

- (void)willAnimateRotationToInterfaceOrientation:UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];

    __block UIView *weakTabBar = [self.tabBarController.view.subviews objectAtIndex:1];
    weakTabBar.alpha = 0;
    [UIView animateWithDuration:duration
                          delay:0
                        options:UIViewAnimationOptionCurveEaseIn // slow at the beggining
                     animations:^{
                         weakTabBar.alpha = 1;
                     }
                     completion:^(BOOL finished) {
                         weakTabBar.alpha = 1;
                     }];
    }

}

Это не скрывает панель вкладок, но делает анимацию вращения более плавной.

Ответ 8

Если у вас есть UITabBarController, тогда поместите в него UINavigationController, тогда вы можете использовать hidesBottomBarWhenPushed (с небольшим количеством обмана), чтобы сделать это.

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];

    if (toInterfaceOrientation == UIInterfaceOrientationPortrait) {
        self.hidesBottomBarWhenPushed = NO;
        self.navigationController.viewControllers = self.navigationController.viewControllers;
        [self transitionToGridLayout];
    }
    else {
        self.hidesBottomBarWhenPushed = YES;
        self.navigationController.viewControllers = self.navigationController.viewControllers;
        [self transitionToCoverflowLayout];
    }
}

Хитрость заключается в том, чтобы нажать на контроллер вашего вида, чтобы флаг hidesBottomBarWhenPushed был поднят. Вы можете использовать следующие.

self.navigationController.viewControllers = self.navigationController.viewControllers;