Скрытие 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". Но я не вижу, как правильно решить эту проблему.
Если кто-то был вокруг этой проблемы, я был бы признателен за помощь.
Благодарю вас,
Сами.
Ответы
Ответ 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;