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

UIView не изменяет размер до полного экрана при скрытии панели навигации и панели вкладок

У меня есть приложение, которое имеет панель вкладок и навигационную панель для нормального взаимодействия. Один из моих экранов - большая часть текста, поэтому я разрешаю пользователю входить в полноэкранный режим (например, 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];
}

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

4b9b3361

Ответ 1

У меня была эта точная проблема, когда я анимировал панель вкладок и панель навигации снизу и сверху экрана соответственно, оставив 49px высокое белое пространство, где была панель вкладок.

Оказывается, причина, по которой мое новое "полноэкранное" представление фактически не заполняло пространство, состояло в том, что я добавлял полноэкранный просмотр в качестве подсмотра представления контроллера навигации, который сам был дочерним элементом контроллера панели вкладок.

Чтобы исправить это, я просто добавил новое полноэкранное представление (в вашем случае представление со всем текстом) в качестве подсмотра представления UITabBarController.

[[[self tabBarController] view] addSubview:yourTextView];

Затем все, что вам нужно сделать, это убедиться, что ваш кадр подвид 480 × 320 пикселей, и он должен заполнить экран (включая область, которая ранее была таинственным пробелом)

Ответ 2

Вы можете определенно сделать что-то, что кажется правильным, переместив рамку представления так, чтобы панель вкладок была выключена. Я знаю, что кто-то еще упомянул об этом, и вы сказали, что это не сработало, но я подозреваю, что проблема в том, что у вас не было настройки маски изменения размера текста, когда вы пытались. Ниже приведен код, который должен работать:

- (void)viewDidLoad {
  [super viewDidLoad];
  currentlyHidden = NO;
}

- (void) hideStuff {
  SO2AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];
  self.navigationController.navigationBarHidden = YES;

  CGRect newFrame = appDelegate.tabBarController.view.frame;
  newFrame.size.height += appDelegate.tabBarController.tabBar.frame.size.height;
  appDelegate.tabBarController.view.frame = newFrame;
}

- (void) showStuff {
  SO2AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];

  CGRect newFrame = appDelegate.tabBarController.view.frame;
  newFrame.size.height -= appDelegate.tabBarController.tabBar.frame.size.height;
  appDelegate.tabBarController.view.frame = newFrame;

  self.navigationController.navigationBarHidden = NO;
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
  if (currentlyHidden) {
    [self showStuff];
    currentlyHidden = NO;
  } else {
    [self hideStuff];
    currentlyHidden = YES;
  }
}

Кроме того, так как это определенно чувствительно к тому, как у вас установлена ​​ваша настройка nibs и т.д., я размещаю проект aa онлайн, чтобы вы могли скачать его и Посмотрите на это. Это довольно минимальная демонстрация, просто проект на основе навигации, в котором делегат настраивает контроллер табуляции и внедряет контроллер вида из основного наконечника. Остальная часть находится в классе и классе RootViewController. Полоски переключаются при каждом касании, поэтому просто коснитесь экрана. Очевидно, что в реальном приложении вам может понадобиться настроить вид прокрутки, чтобы контент не отображался.

Ответ 3

Установили ли ваше свойство контроллера hidesBottomBarWhenPushed значение YES? Вы должны установить это в свой метод initWithNibName:bundle: или initWithCoder:. Когда он будет перенаправлен на навигационный контроллер, это должно скрыть панель вкладок и сделать представление содержимого более длинным.

Ответ 4

Может быть, есть другое представление, которое является встроенной частью области панели вкладок? То есть, что-то дополнительное, чтобы скрыть. Это поможет вам увидеть, какие взгляды вокруг.

for (UIView *viewy in [self.navigationController.view subviews])
{
    NSLog([viewy description]);
}

Ответ 5

Я обнаружил, что если вы помечаете новое представление, вы будете нажимать на стек навигации, а следующая строка скрывает панель вкладок, пока она находится в стеке.

scrollViewController.hidesBottomBarWhenPushed = YES;

Ответ 6

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

Ответ 7

Попробуйте сделать отображение TabBarControllers большим, чем экран, чтобы панель вкладок была скрыта от экрана, пока вы это делаете до того, как будет установлен новый ViewController, тогда его представление изменит размер, чтобы заполнить новый кадр!

В моем тесте я использовал метод tabBarController: shouldSelectViewController: delegate, чтобы проверить, какой контроллер представления должен стать текущим, и соответствующим образом настроить TabBarController.view.frame. Например:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    if( viewController == second)
        tabBarController.view.frame = CGRectMake( 0, 20, 320, 500);
    else
        tabBarController.view.frame = CGRectMake( 0, 20, 320, 460);
}

Если это еще не совсем то, что вам нужно, попробуйте взглянуть в свойство hidesBottomBarWhenPushedPUUVITCULTLLER. Если установлено yes, это приведет к тому, что нижняя панель будет скрыта, если контроллер будет перенесен в стек навигации.

Ответ 8

Я бы переместил вид в окно, когда вы решите перейти в полноэкранный режим. например.

myView = [self.view retain];
self.view = nil;
[window addSubview:myView];

и вернуться:

[myView removeFromSuperView];
self.view = myView;
[myView release];
myView = nil;

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

Затем вы можете объединить это с

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

для обнаружения вращения. (Я думаю, что вы комбинируете это с view.transform = CGAffineTransformMakeRotation, чтобы заставить его вращаться...?)

Ответ 9

У меня была аналогичная проблема. Поскольку Гарри упомянул об этом, это является поводом для навигационного контроллера, который является внутренним контроллером контроллера панели вкладок. Нашел другой способ, как перерисовать ваше мнение и иметь правильный фрейм. В контроллере добавьте следующее:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // Here you can make your tabBarControlelr.view.hidde = true or use any animation that hides UITabBar. I made
    [TabBarController setTabBarHidden:YES];

    self.navigationController.view.frame = CGRectMake(self.navigationController.view.frame.origin.x, self.navigationController.view.frame.origin.y, self.navigationController.view.frame.size.width, self.navigationController.view.frame.size.height + 50);
    [self.navigationController.view setNeedsLayout];

 }

И вот как я его скрываю. Я могу сделать это непосредственно вызывающим методом TabBarControlelr или оболочкой метода класса:

+ (void)setTabBarHidden:(BOOL)hidden
{
    AppDelegate *delegate = [UIApplication sharedApplication].delegate;
    TabBarController *tabBarController = (TabBarController *) delegate.window.rootViewController;

    if ([tabBarController isKindOfClass:[TabBarController class]]) {
        [tabBarController setTabBarHidden:hidden];
    }
}


- (void)setTabBarHidden:(BOOL)hidden
{
    if (self.tabBar.hidden == hidden) {
        return;
    }

    if (hidden == NO) {
        self.tabBar.hidden = hidden;
    }

    [UIView animateWithDuration:0.15 animations:^{
        self.tabBar.frame = CGRectOffset(self.tabBar.frame, 0, ( hidden ? 50 : -50 ));
    } completion:^(BOOL finished) {
        self.tabBar.hidden = hidden;
    }];
}

Ответ 10

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

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

- (void)moveViewToSuperview:(UIView *)view
{
    UIView *newSuperview = [[view superview] superview];
    [view removeFromSuperview];
    [newSuperview addSubview:view];
    [newSuperview bringSubviewToFront:view];
}

Ответ 11

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

Ответ 12

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

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

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

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

Ответ 13

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

Tony ответ помог мне обнаружить, что при создании подзаголовки полезно установить код, похожий на этот:

self.tabBarController.tabBar.frame = self.view.bounds;

Ответ 14

Поместите код в готовое для segue, как это, отлично работает для меня:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"ViewPhoto"]) {

    ImageView *vc = [segue destinationViewController];

    NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];

        NSString *Title = [photoNames objectAtIndex:selectedIndex];
        [vc setSelectedTitle:[NSString stringWithFormat:@"%@", Title]];

        vc.hidesBottomBarWhenPushed = YES;

        }
    }

Ответ 15

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