Pergunta

Eu não consigo obter um UISearchBar se posicionar a partir da extrema esquerda à extrema direita na barra de navegação. No - (void) viewDidLoad método, eu tenho o seguinte código:

UISearchBar *sb = [[UISearchBar alloc] initWithFrame:self.tableView.tableHeaderView.frame];
sb.delegate = self;
self.navigationItem.titleView = sb;
[sb sizeToFit];
[sb release];

Quando você construir e executar, ele parece muito bem à primeira vista. No entanto, olhando mais de perto, você pode dizer que haja uma margem / espaço à esquerda. Isso não seria um grande negócio no grande esquema das coisas, mas quando eu toque na barra de pesquisa para iniciar uma pesquisa, eu animar o botão de cancelamento em vista. Porque a barra de pesquisa está posicionado ligeiramente para a direita, a animação é irregular eo botão cancelar chega ao fim assim: link de texto

Parece como se o UINavigationItem é como uma tabela com três células, onde há um preenchimento no primeiro e último que eu não posso removê - nem parece haver uma maneira de 'merge' tudo junto e em seguida, coloque a barra de pesquisa lá. Eu sei que este olhar é possível, porque a busca AppStore tem uma barra de busca na barra de navegação e ele vai todo o caminho até as bordas. Alguém sabe como obter a barra de pesquisa para percorrer todo o caminho até as bordas assim que meu slide-in cancelar animação botão funcionará corretamente?

Foi útil?

Solução 3

Eu acho que eu descobri a resposta - embora eu não tenha testado para verificar. Na edição que eu forneci acima, eu tenho a seguinte estrutura:

controlador de barra de abas -> controlador de navegação -> controlador de vista (s)

A barra de pesquisa em questão estava em um controlador de vista, que por sua vez estava no comando de navegação, que controlador de navegação é na barra de abas.

Eu estava casualmente assistindo a cursos e no final da Aula 13 Stanford CS 193P (Primavera de 2009), a resposta pode ter sido apresentado. Alan Cannistraro afirmou que a estrutura do aplicativo Presença deve ter a seguinte estrutura:

esta estrutura http://img143.imageshack.us/img143/6/viewcontrollerstructure .jpg

em que o controlador de exibição de fundo (adjacente ao controlador de barra de guia) foi o controlador de visualização, que tinha o controlo barra de pesquisa. Ele alertou, se não é feito desta forma, você vai "executar em problemas". Possivelmente, o problema que eu enfrentei? Eu acredito que sim.

Outras dicas

Na verdade, há uma solução muito simples. Tudo que você tem a fazer é criar uma visão de largura zero para o item de volta:

UIView *hackView = [[UIView alloc] initWithFrame:CGRectZero];
UIBarButtonItem *hackItem = [[UIBarButtonItem alloc] initWithCustomView:hackView];      
self.navigationItem.backBarButtonItem = hackItem;
[hackView release];
[hackItem release];

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
[searchBar sizeToFit];
self.navigationItem.titleView = searchBar;
[searchBar release];

Certifique-se de fazer isso em seu método loadView, não o init. Eu não sei por que isso faz a diferença, mas ele faz.

Aparentemente é questão de tempo. Tê-lo em loadView parou de trabalhar para mim, mas colocá-lo em obras viewWillAppear (com um cheque para que ele só é feito uma vez, é claro). Acho que a idéia é definir o titleView depois de algum inicialização já foi concluída.

Os seguintes peles código do NavigationBar apenas para esta UIViewController:

- (void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

Assim, para obter o UISearchBar para mostrar no lugar do UINavigationBar, em seu controlador de vista raiz apenas tem sua barra de pesquisa onde a barra de navegação seria normalmente!

Talvez a Apple está usando um UISearchDisplayController para fazer esses tipos de coisas.

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