Eu faço UISearchBar
parte da barra de navegação como:
let searchBar = UISearchBar()
//some more configuration to the search bar
.....
navigationItem.titleView = searchBar
Depois de atualizar iOS 11
algo estranho aconteceu com a barra de pesquisa do meu aplicativo. No dia iOS 10
e antes, minha barra de navegação parecia:
Agora com iOS 11
eu tenho:
Como você pode ver, há diferença no arredondamento das duas barras de pesquisa o que não me incomoda. O problema é que a barra de pesquisa aumenta a altura da barra de navegação. Então, quando vou para outro controlador, também parece estranho:
Na verdade, aquela estranha altura da linha preta mais a altura da barra de navegação atual é igual à altura da barra de navegação mostrada na segunda imagem ...
Alguma ideia de como se livrar da linha preta e ter a altura da barra de navegação consistente em todos os controladores de visualização?
fonte
Respostas:
Obtive linha preta em NavigationBar com SearchBar no iOS 11 em dois casos:
quando eu empurrei outro ViewControllers de ViewController com UISearchBar
quando eu descartei o ViewController com UISearchBar com "arrastar para a direita para dispensar"
Minha solução foi: adicionar este código ao meu ViewController com UISearchBar:
Atualização do Swift 4
fonte
Você pode adicionar uma restrição de altura 44 à barra de pesquisa do iOS 11.
// Rápido
// Objective-C
fonte
Eu acredito que no iOS 11 UISearchBar agora tem altura igual a 56, e UINavigationBar usa autolayout para ajustar suas subvisualizações, portanto, aumenta a altura. Se você ainda deseja ter UISearchBar como titleView como no pré-iOS 11, descobri que a melhor maneira de fazer isso é incorporar UISearchBar em uma visualização personalizada e definir a altura dessa visualização para 44 e atribuí-la a navigationItem.titleView
fonte
tente este código no controlador de visualização "ACKNOWLEDGMENTS" em viewDidLoad
fonte
extendedLayoutIncludesOpaqueBars
propriedade faz.Obrigado a todos! Finalmente encontrei uma solução.
Adicionando o seguinte código ao ViewController com UISearchBar.
viewDidLoad
viewWillDisappear
fonte
Em Objective-C
fonte
Isso aconteceu comigo também, tudo funcionando bem no iOS 12.4 e ficando estranho no 13 acima. O problema está no aumento da altura da barra de navegação do iOS 13 de 88 para 100 após o salto de UIViewController que implementa searchBar.
Tente isso em seu UIViewController que implementa searchBar.
Visualização após correção:
Visualize antes de corrigir:
fonte
EDITAR: a resposta @zgjie é a melhor solução para este problema: https://stackoverflow.com/a/46356265/1713123
Parece que isso acontece porque no iOS 11 o valor de altura padrão de SearchBar foi alterado para 56, em vez de 44 nas versões anteriores do iOS.
Por enquanto, apliquei esta solução alternativa, definindo a altura de searchBar de volta para 44:
Outra solução poderia ser usar a nova propriedade searchController em navigationItem no iOS 11 :
Mas desta forma, a searchBar aparece abaixo do título de navegação.
fonte
CGRect().insetBy(dx:dy:)
eCGRect().offsetBy(dx:dy:)
, neste caso -searchController.searchBar.frame = searchController.searchBar.frame.insetBy(dx: 0, dy: -12)
Todas as soluções não funcionaram para mim, então antes de empurrar o controlador de visualização, eu fiz:
E para tornar a barra de pesquisa presente ao voltar:
fonte
Não consegui usar a solução de manter o navBar em 44. Então demorei um dia, mas finalmente encontrei uma solução que não muda a altura da barra e posiciona o botão no meio dela. O problema é que os botões são colocados em uma visualização de pilha configurada como visualização de pilha horizontal e, portanto, não se ajusta à mudança de altura.
Isso é feito no init:
em viewWillApear (ou a qualquer momento depois que a visualização foi adicionada à pilha de navegação)
E subviewOfClass é uma categoria no UIView:
fonte
Tudo que você precisa fazer é criar uma subclasse de UISearchBar e substituir "intrinsicContentSize":
fonte
Não é possível comentar, mas gostaria de compartilhar alguns problemas adicionais que encontrei enquanto passava muitas horas tentando chegar ao fundo desse problema, mesmo depois de usar uma das outras soluções.
Parece que a melhor solução para mim foi a resposta de Andrew :
No entanto, pelo menos no iOS 12.1 , se
UINavigationBar
:isTranslucent
definido comofalse
, o View Controller com a barra de pesquisa parece não ter seu layout de view ajustado de volta ao dispensar interativamente (dispensar normal por meio do botão Voltar parece funcionar).setBackgroundImage(UIImage(), for: .default)
, a animação de transição não funciona corretamente e voltará para sua posição após terminar.Essas propriedades específicas foram definidas para fazer a barra de navegação aparecer de uma certa maneira, no entanto, eu preciso fazer alguns ajustes para recuperá-la ou aguentar o comportamento estranho. Tentarei me lembrar de atualizar o acima, se encontrar algo diferente ou encontrar outras soluções ou diferenças em outras versões do sistema operacional.
fonte
No meu caso, a altura maior do UINavigationBar não foi um problema para mim. Eu só precisava realinhar os itens dos botões da barra esquerda e direita. Essa é a solução que eu encontrei:
Basicamente, procuramos por visões de pilha que contêm itens de botão de barra e, em seguida, alteramos seus valores de restrição superior e inferior. Sim, é um hack sujo e não recomendo usá-lo se você puder consertar seu problema de qualquer outra maneira.
fonte
fonte
Eu descobri que a solução de Mai Mai é a única realmente utilizável.
No entanto, ainda não é perfeito:
ao girar o dispositivo, a barra de pesquisa não é redimensionada corretamente e permanece em uma dimensão menor.
Eu encontrei uma solução para isso. Aqui está meu código em Objective C com as partes relevantes anotadas:
Agora ainda há um caso que eu não descobri ainda. Para reproduzir, faça o seguinte:
- comece em retrato
- ative o campo de pesquisa
- gire para paisagem
- erro: a barra não redimensiona
fonte
Corrigi isso adicionando a restrição para viewDidAppear no controlador de visualização de mapa onde a barra de pesquisa está embutida
fonte
Olá para as pessoas que usam
UISearchController
e, em seguida, anexando-asUISearchBar
aonavigationItem.titleView
. Eu gastei 4-5 horas loucas do meu dia para resolver isso. Após o iOS 11+ abordagem recomendada, que é colocar osearchController
ànavigation.searchController
não é apenas adequado para o meu caso. A tela que tem esse searchController / searchBar tem um backButton, customizado.Eu testei isso no iOS 10, iOS 11 e 12. Em diferentes dispositivos. Eu apenas tive que fazer. Não posso ir para casa sem resolver esse demônio. Isso é o mais perfeito que eu poderia fazer hoje, devido ao meu prazo apertado.
Então, eu só quero compartilhar este trabalho árduo que fiz, cabe a você colocar tudo onde quiser (ex. Variáveis em seu viewModel). Aqui vai:
Na minha primeira tela (digamos tela inicial, que não tem esse controlador de pesquisa), tenho isso na minha
viewDidLoad()
.Na minha segunda tela, aquela que contém o searchController, tenho isso na minha
viewDidAppear
.substituir função viewDidAppear (_ animated: Bool) {super.viewDidAppear (animado)
e aqui está a declaração de meu searchController:
Espero que algum dia isso ajude alguém.
fonte
Tentei várias coisas para voltar ao tamanho original 44, mas a barra de pesquisa sempre parece e se comporta de forma estranha - como estar muito esticada, com deslocamento em y e semelhantes.
Encontrei uma boa solução aqui (por meio de alguma outra postagem stackoverflow): https://github.com/DreamTravelingLight/searchBarDemo
Basta derivar seu viewcontroller do SearchViewController e incluir em seu projeto as classes SearchViewController e WMSearchbar. Funcionou fora da caixa para mim, sem qualquer feio if (iOS11) ... feio.
fonte
No meu caso, tenho que diminuir a altura do textField 36pt -> 28pt.
Então tentei mudar a altura da moldura, a altura da camada. Mas os caminhos não funcionaram.
Finalmente, encontrei uma solução que é a máscara. Eu penso: não é uma boa maneira, mas funciona.
Você pode alterar as inserções, se quiser alterar a moldura do textField.
fonte