Pergunta

Eu tenho um aplicativo que tem um guia bar & nav bar para a interação normal. Uma das minhas telas é uma grande parte do texto, então eu permitir que o usuário toque para ir para tela cheia (algo como Photos.app).

A barra de navegação e barra de abas estão escondidos, e eu definir o quadro de vista o texto a ser tela cheia. O problema é, não é de cerca de 50 pixels de espaço em branco onde a barra de guia utilizado para ser. Você pode ver se a partir desta captura de tela:

removido ligação ImageShack mortos

Eu não tenho certeza o que está causando isso. O espaço em branco não é definitivamente a visão por trás da exibição de texto, como eu defini-lo de cor de fundo para vermelho só para ter certeza. O que poderia estar causando isso?

Atualização ** **

Eu fiz alguns testes hit em uma subclasse UIWindow e descobri que o espaço em branco é realmente a UILayoutContainerView indocumentados / inédito. Esta é a vista principal da barra de páginas. Eu não acho que é recomendado para manipular diretamente este ponto de vista, então como eu posso esconder a barra de abas?

** ATUALIZAÇÃO # 2 **

Eu verifiquei quadro de self.view antes e após a animação, e parece que a vista principal não está redimensionando o suficiente.

depois de ir fullscreen, quadro da vista é de apenas 411 pixels de altura. Eu tentei mexer com a estrutura manualmente e também definir autoResizeMask sem sorte.

**** UPDATE: Aqui está o resultado final ****

- (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];
}

(note que eu mudei textview para webview, mas as mesmas obras para a exibição de texto original)

Foi útil?

Solução

Eu tive esse problema exato onde eu estava animando a barra de abas e barra de navegação fora da parte inferior e superior da tela, respectivamente, deixando um espaço de alta 49px branca onde a barra de abas foi.

Acontece que a razão minha visão nova "tela cheia" não foi, na verdade, preenchendo o espaço foi porque eu estava adicionando a visualização em tela cheia como um subview de vista do controlador de navegação, que em si era uma criança do controlador de barra de abas.

Para corrigir isso, eu simplesmente adicionado a nova visualização de tela cheia (no seu caso a vista com todo o texto) como um subview de vista do UITabBarController.

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

Então tudo que você precisa fazer é se certificar de que quadro do seu subexibição é 480 x 320px e deve preencher a tela (incluindo a área que anteriormente era o espaço em branco misterioso)

Outras dicas

Você pode definitivamente fazer algo que parece correta, mudando o quadro da vista de tal forma que a barra de abas é fora da tela. Eu sei que alguém mencionou a tentar isso, e você disse que não funcionou, mas eu suspeito que o problema é que você não tem os TextViews redimensionar configuração máscara corretamente quando você tentou. Abaixo está o código que deve funcionar:

- (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;
  }
}

Além disso, uma vez que este é definitivamente sensível à forma como você tem sua configuração nibs etc, estou postando aa projeto on-line para que você pode baixá-lo e obter um olhar para ele. É uma demonstração muito mínima, apenas um projeto baseado navegação, onde os conjuntos de delegado de um controlador de guia e incorpora o controlador de vista do nib principal. O resto está na ponta RootViewController e classe. As barras são alternados sempre que um toque começa, então, basta tocar na tela. Obviamente, em uma aplicação real que você pode precisar de ajustar a exibição da rolagem de modo coisas o conteúdo não parece saltar.

Você definir a propriedade hidesBottomBarWhenPushed do seu controlador de exibição para YES? Você precisa definir isso no seu initWithNibName:bundle: ou método initWithCoder:. Quando é empurrado para o controlador nav, isso deve ocultar a barra de guia e fazer a exibição de conteúdo estender até o fundo.

Talvez haja outra visão de que é um built-in parte da área da barra de guia? Ou seja, algo adicional para esconder. Isso ajudará você a ver o que vistas estão ao redor.

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

Descobri que se você marcar a nova visão que você estará empurrando para a pilha de navegação com as seguintes peles de linha da barra de guia enquanto ele estiver na pilha.

scrollViewController.hidesBottomBarWhenPushed = YES;

Eu acredito que o problema é que você ainda está no controlador de barra de abas, eu bati algumas questões com este tão bem, e acabou criando duas visões para meu aplicativo delegado para o controle, o controlador de barra de abas, e um UIView separada que contém tudo o que o controlador de barra de abas tenta assumir o comando de. Você poderia passar a sua visão para o delegado app e usá-lo lá, talvez?

Tente fazer as TabBarControllers ver maior que a tela de modo que a barra de abas está escondido fora da tela, enquanto você fazer isso antes o novo ViewController é definido, em seguida, seu ponto de vista será redimensionada para preencher o novo quadro!

No meu teste eu usei o tabBarController: shouldSelectViewController: método delegado para verificar qual o controlador de exibição está prestes a tornar-se atual e definir o TabBarController.view.frame conformidade. Por exemplo:

- (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);
}

Se isso ainda não é o que você precisa, tente olhar para a propriedade hidesBottomBarWhenPushed de UIViewController. Quando ajustado para sim isso fará com que a pele barra inferior se o controlador é empurrado em uma pilha de navegação.

Gostaria de mover a vista para a janela quando você optar por ir fullscreen. por exemplo.

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

e para voltar:

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

Ao adicionar a vista como uma criança da janela, pode ser totalmente fullscreen e vai estar no topo da barra de guias.

Você pode então combinar isso com

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

para detectar rotação. (Eu acho que você combinar isso com view.transform = CGAffineTransformMakeRotation para fazê-lo girar ...?)

Eu tive problema semelhante. Como Harry mencionou que é um motivo de controlador de navegação que é o controlador interno do Tab Bar Controller. Encontrou outra maneira de como redesenhar o seu ponto de vista e tem quadro correto, no seu suplemento controlador seguintes:.

- (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];

 }

E aqui está como eu escondê-lo. Eu posso fazer isso diretamente chamando o método de TabBarControlelr ou método classe wrapper:

+ (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;
    }];
}

Se você estiver usando Interface Builder, garantir o redimensionamento automático está definido corretamente no Tamanho Inspector. Se você criar o UITextView no código, certifique-se de definir o quadro para ser grande o suficiente e que o pai da vista (e dos pais) também são grandes o suficiente. Para simplificar, adicione a vista para a janela diretamente, e depois passar para dentro de lá.

Para mover em vista a sua superview:

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

Você já tentou forçar o texto para "re-write" em si (repor a propriedade .text de qualquer objeto que você está usando)? Eu tive muitos casos em que vistas simplesmente não re-cheque ou redesenhar seus dados, e forçando parece ser a única solução. Se isso não é bom a partir de uma experiência de usuário ponto de vista, você pode tentar fazer as nav / tabbars transparente após os toques do usuário, e antes que eles desapareçam. Isso normalmente se estende a vista para o tamanho total da tela.

Se o UITabBarController é empurrado por um RootViewController (navigationController). Você pode tentar o seguinte:

Primeiro esconder o status Bar / Tab Bar;

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

Você deve ser capaz de recuperar o espaço em branco, embora a tela irá chocar durante o ajuste ...

Eu experimentei um problema semelhante, essa discussão foi útil: UIWebView no iPad tamanho

resposta Tony 's me ajudou a descobrir que quando você cria um subexibição é útil código de configuração semelhante a este:

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

Coloque o código em um preparar para segue assim, funciona perfeitamente para mim:

- (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;

        }
    }

Adicione o amt extra de espaço para a dimensão do ponto de vista, por isso, se era retângulo CGRectMake (0,0,320,460) torná-lo CGRectMake (0,0,320,480) ... Isto aconteceu-me, Im n ot exatamente certo porque , poderia ahve a ver com a visão subjacente você está colocando sua exibição de texto no topo off, mas apenas adicionando a dimensão deve fazê-lo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top