UIView не меняет размер на весь экран при скрытии панели навигации и панели вкладок - PullRequest
37 голосов
/ 10 июля 2009

У меня есть приложение с панелью вкладок и панелью навигации для нормального взаимодействия. Один из моих экранов - это большая часть текста, поэтому я позволяю пользователю нажимать, чтобы перейти в полноэкранный режим (вроде как Photos.app).

Панель навигации и панель вкладок скрыты, и я установил полноэкранный режим просмотра текста. Проблема в том, что там, где раньше была панель вкладок, есть около 50 пикселей пустого пространства. Вы можете увидеть, если из этого снимка экрана:

удалена мертвая ссылка ImageShack

Я не уверен, что вызвало это. Пробел определенно не является видом позади текстового представления, поскольку я устанавливаю его цвет фона на красный, чтобы быть уверенным. Что может быть причиной этого?

** ОБНОВЛЕНИЕ **

Я провел некоторое тестирование на попадание в подклассе UIWindow и обнаружил, что пробел на самом деле является недокументированным / неопубликованным UILayoutContainerView. Это родительский вид tabBar. Я не думаю, что рекомендуется напрямую манипулировать этим видом, так как я могу скрыть панель вкладок?

** ОБНОВЛЕНИЕ № 2 **

Я проверил кадр self.view до и после анимации, и похоже, что родительский вид недостаточно изменяет размеры.

после перехода в полноэкранный режим рамка просмотра имеет высоту всего 411 пикселей. Я попытался поэкспериментировать с фреймом вручную, а также установил autoResizeMask без удачи.

**** ОБНОВЛЕНИЕ: вот конечный результат ****

- (void)toggleFullscreen {
    isFullScreen = !isFullScreen;  //ivar

    //hide status bar & navigation bar
    [[UIApplication sharedApplication] setStatusBarHidden:isFullScreen animated:YES];
    [self.navigationController setNavigationBarHidden:isFullScreen animated:YES];

    [UIView beginAnimations:@"fullscreen" context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:.3];

    //move tab bar up/down
    CGRect tabBarFrame = self.tabBarController.tabBar.frame;
    int tabBarHeight = tabBarFrame.size.height;
    int offset = isFullScreen ? tabBarHeight : -1 * tabBarHeight;
    int tabBarY = tabBarFrame.origin.y + offset;
    tabBarFrame.origin.y = tabBarY;
    self.tabBarController.tabBar.frame = tabBarFrame;

    //fade it in/out
    self.tabBarController.tabBar.alpha = isFullScreen ? 0 : 1;

    //resize webview to be full screen / normal
    [webView removeFromSuperview];
    if(isFullScreen) {
                //previousTabBarView is an ivar to hang on to the original view...
        previousTabBarView = self.tabBarController.view;
        [self.tabBarController.view addSubview:webView];

        webView.frame = [self getOrientationRect];  //checks orientation to provide the correct rect

    } else {
        [self.view addSubview:webView];
        self.tabBarController.view = previousTabBarView;
    }

    [UIView commitAnimations];
}

(обратите внимание, что я переключил просмотр текста в веб-просмотр, но то же самое работает для исходного просмотра текста)

Ответы [ 15 ]

0 голосов
/ 01 августа 2011

У меня возникла похожая проблема, это обсуждение было полезным: UIWebView на iPad размером

Ответ Тони помог мне обнаружить, что при создании подпредставления полезно настроить код, подобный следующему:

self.tabBarController.tabBar.frame = self.view.bounds;
0 голосов
/ 22 октября 2010

Если UITabBarController выдвигается rootViewController (navigationController). Вы можете попробовать следующее:

Сначала скрыть строку состояния / панель вкладок;

[self.navigationController pushViewController:aBlankViewController animated:NO];
[self.navigationController popViewControllerAnimated:NO];

Вы должны быть в состоянии исправить пустое пространство, хотя экран будет шокировать во время регулировки ...

0 голосов
/ 21 июля 2009

Вы пытались заставить текст «переписать» сам себя (сбросить свойство .text того объекта, который вы используете)? У меня было много случаев, когда представления просто не перепроверяют или перерисовывают свои данные, и форсирование кажется единственным исправлением. Если это нехорошо с точки зрения взаимодействия с пользователем, вы можете попытаться сделать прозрачные панели навигации / вкладок после того, как пользователь коснется их, и до того, как они исчезнут. Это обычно расширяет представление до полного размера экрана.

0 голосов
/ 19 июля 2009

Если вы используете Interface Builder, убедитесь, что автоматическое изменение размера установлено правильно в инспекторе размера. Если вы создаете UITextView в коде, убедитесь, что вы установили достаточно большой кадр и чтобы родительский элемент представления (и его родитель) также был достаточно большим. Для простоты добавьте вид непосредственно в окно, а затем оттуда войдите внутрь.

Чтобы переместить представление в его суперпредставление:

- (void)moveViewToSuperview:(UIView *)view
{
    UIView *newSuperview = [[view superview] superview];
    [view removeFromSuperview];
    [newSuperview addSubview:view];
    [newSuperview bringSubviewToFront:view];
}
0 голосов
/ 10 июля 2009

Добавьте дополнительный размер пространства к измерению представления, поэтому, если это был прямоугольник CGRectMake (0,0,320,460), сделайте его CGRectMake (0,0,320,480) ... Это случилось со мной, я точно не знаю, почему , это может иметь отношение к базовому представлению, над которым вы добавляете текстовое представление, но простое добавление измерения должно сделать это

...