Eu criei uma barra de ferramentas no IB com vários botões. Eu gostaria de poder ocultar / mostrar um dos botões, dependendo do estado dos dados na janela principal.
UIBarButtonItem
não possui uma propriedade oculta, e quaisquer exemplos que encontrei até agora para ocultá-los envolvem a configuração de botões da barra de navegação como nulos, o que eu acho que não quero fazer aqui, porque talvez seja necessário exibir o botão novamente (não para mencionar que, se eu conectar meu botão a um IBOutlet, se eu configurá-lo como nulo, não sei como recuperá-lo).
ios
uibarbuttonitem
uitoolbar
Sasha
fonte
fonte
Respostas:
Salve seu botão em uma tomada forte (vamos chamá-lo
myButton
) e faça isso para adicionar / remover:Como está armazenado na tomada, você manterá uma referência a ele mesmo quando não estiver na barra de ferramentas.
fonte
Eu sei que esta resposta está atrasada para esta pergunta. No entanto, pode ajudar se mais alguém enfrentar uma situação semelhante.
No iOS 7, para ocultar um item do botão de barra, podemos usar as duas técnicas a seguir: -
SetTitleTextAttributes
: - Funciona muito bem em itens do botão da barra, como "Concluído", "Salvar" etc. No entanto, não funciona em itens como Adicionar, símbolo da Lixeira etc. (pelo menos não para mim), pois não são textos.TintColor
: - Se eu tiver um item de botão de barra chamado "deleteButton": -Para ocultar o botão, usei o seguinte código: -
Para mostrar o botão novamente, usei o seguinte código: -
fonte
deleteButton.enabled = false; deleteButton.tintColor = UIColor.clearColor()
para desativar e ocultar, edeleteButton.enabled = true; deleteButton.tintColor = nil
para reativar e mostrar normalmente.UIColor.clear
paraUIControlState.disabled
e pode mostrar / ocultar o botão comsetEnabled
. Obviamente, como você afirmou, isso funciona apenas para botões de texto.Aqui está uma abordagem simples:
Acabei de executá-lo no meu iPad de retina e .01 é pequeno o suficiente para não aparecer.
fonte
self.window?.tintColor = APP_PRIMARY_COLOR
em AppDelegate, então isso não vai funcionarÉ possível ocultar um botão no lugar sem alterar sua largura ou removê-lo da barra. Se você definir o estilo para simples, remover o título e desativar o botão, ele desaparecerá. Para restaurá-lo, basta reverter suas alterações.
fonte
Abaixo está minha solução, embora eu estivesse procurando pela Barra de Navegação.
Aqui "navBar" é um IBOutlet para o NavigationBar na exibição em XIB. Aqui eu queria ocultar o botão ou mostrá-lo com base em alguma condição. Então, estou testando a condição em "If" e se true, estou definindo o botão como nulo no método viewDidLoad da exibição de destino.
Isso pode não ser relevante para o seu problema exatamente, mas existe algo semelhante se você deseja ocultar os botões no NavigationBar
fonte
rightBarButtonItem
novamente mais tarde , verifique se o item do botão está armazenado em um IBOutlet forte, para que não seja liberado quando você o retirar da barra de navegação.Para Swift 3 e Swift 4, você pode fazer isso para ocultar
UIBarButtomItem
:E para mostrar o
UIBarButtonItem
:No,
tintColor
você deve especificar a cor de origem que está usando para oUIBarButtomItem
fonte
Atualmente, estou executando o OS X Yosemite Developer Preview 7 e o Xcode 6 beta 6 visando o iOS 7.1 e a seguinte solução funciona bem para mim:
UINavigationItem
eUIBarButtonItem
sExecute o código a seguir para remover
Execute os seguintes códigos para adicionar botões novamente
fonte
Eu usei o IBOutlets no meu projeto. Então, minha solução foi:
E quando precisar mostrar essa barra novamente, basta definir propriedades invertidas.
Em Swift 3 em vez
enable
usarisEnable
propriedade.fonte
self.dismissButton.customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
fonte
iOS 8. UIBarButtonItem com imagem personalizada. Tentou muitas maneiras diferentes, a maioria delas não estava ajudando. A solução de Max
setTintColor
não estava mudando para nenhuma cor. Eu mesmo descobri este, pensei que seria útil para alguém.Para esconder:
Para mostrar:
fonte
Experimente no Swift , não atualize o
tintColor
se você tiver algum design para o seu UIBarButtonItem, como o tamanho da fonte no AppDelegate, isso mudará totalmente a aparência do seu botão ao aparecer.No caso de um botão de texto, a alteração do título pode deixar o botão 'desaparecer'.
fonte
Descobri outra ruga na abordagem
tintColor
eisEnabled
sugerida por Max e outros - quando o VoiceOver está ativado para acessibilidade e o botão está logicamente oculto, o cursor de acessibilidade ainda focaliza o botão da barra e afirma que está "esmaecido" (ou seja, porqueisEnabled
está definido como falso). A abordagem na resposta aceita não sofre esse efeito colateral, mas outro trabalho que encontrei foi definirisAccessibilityElement
falso quando "ocultando" o botão:E, em seguida,
isAccessibilityElement
voltando a true quando "mostrando" o botão:Ter o item do botão da barra ainda ocupando espaço não era um problema no meu caso, pois estávamos ocultando / mostrando a parte mais à esquerda dos itens do botão da barra à direita.
fonte
E agora simplesmente mude de
isHidden
propriedade.fonte
Melhorando de @lnafziger answer
Salve seus Barbuttons em uma tomada forte e faça isso para ocultar / mostrar:
Sempre que necessário, use abaixo da Função.
fonte
Basta definir
barButton.customView = UIView()
e ver o truquefonte
Não há como "ocultar" um UIBarButtonItem. Você deve removê-lo do superView e adicioná-lo novamente quando desejar exibi-lo novamente.
fonte
Este é um longo caminho até a lista de respostas, mas, caso alguém queira copiar e colar com facilidade a solução rápida, aqui está
fonte
Uma maneira de fazer isso é usar a
initWithCustomView:(UIView *)
propriedade de quando alocar oUIBarButtonItem
. Subclasse paraUIView
terá propriedade de ocultar / mostrar.Por exemplo:
1. Tenha uma
UIButton
que você deseja ocultar / mostrar.2. Faça
UIButton
como a visualização personalizada. Gostar :3. Você pode ocultar / mostrar o
myButton
que você criou.[myButton setHidden:YES];
fonte
Para a versão Swift, aqui está o código:
Para
UINavigationBar
:fonte
Definir a cor do texto para uma cor clara quando o item do botão da barra estiver desativado é provavelmente uma opção mais limpa. Não há esquisitices que você precise explicar em um comentário. Além disso, você não destrói o botão para manter os seguimentos do storyboard associado.
Então, sempre que quiser ocultar o item do botão da barra, você pode:
É coxo não há propriedade oculta, mas isso oferece o mesmo resultado.
fonte
Caso o UIBarButtonItem tenha uma imagem em vez do texto, você pode fazer isso para ocultá-la:
navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;
fonte
Alguns métodos auxiliares que pensei em compartilhar com base na resposta aceita pelo lnafziger, pois tenho várias barras de ferramentas e vários botões em cada um:
fonte
Você pode facilmente obter a visualização e ocultá-la dessa maneira
fonte
Se você estiver usando o Swift 3
fonte
Aqui está uma extensão que irá lidar com isso.
USO:
fonte
Complementando a resposta de Eli Burke, se você
UIBarButtonItem
tiver uma imagem de plano de fundo em vez de um título, você pode usar o código:fonte
Você precisa manipular a matriz toolbar.items.
Aqui está um código que eu uso para ocultar e exibir um botão Concluído. Se o botão estiver na extremidade da barra de ferramentas ou entre outros botões, os outros botões se moverão; portanto, se você quiser que ele desapareça, coloque-o como o último botão em direção ao centro. Eu animar o botão mover para efeito, eu gosto bastante.
}
agora você pode usar o código a seguir para mostrar seu botão
ou ocultar seu botão
fonte
No IB, se você deixar o título do botão em branco, ele não aparecerá (nunca inicializado?). Faço isso frequentemente durante o desenvolvimento durante as atualizações da interface do usuário, se quiser que um item do botão de barra temporariamente desapareça para uma compilação sem excluí-lo e descartar todas as referências de saída.
Isso não tem o mesmo efeito durante o tempo de execução, definir o título do botão como nulo não fará com que o botão inteiro desapareça. Desculpe, na verdade, não responde à sua pergunta, mas pode ser útil para alguns.
Editar: Este truque só funciona se o estilo do botão estiver definido como simples
fonte
Vou adicionar minha solução aqui, pois ainda não a encontrei mencionada aqui. Eu tenho um botão dinâmico cuja imagem depende do estado de um controle. A solução mais simples para mim foi definir a imagem como
nil
se o controle não estivesse presente. A imagem era atualizada sempre que o controle era atualizado e, portanto, era ideal para mim. Só para ter certeza que eu também definir oenabled
queNO
.Definir a largura para um valor mínimo não funcionou no iOS 7.
fonte
Com crédito para @lnafziger, @MindSpiker, @vishal, et. al
O liner mais simples que cheguei para um único botão da barra direita (ou esquerda) é:
Como em:
Testei isso e funciona para mim (com o item do botão de barra forte conectado via IB).
fonte