No iOS 7, meus títulos UIButton estão entrando e saindo na hora errada - atrasados. Esse problema não aparece no iOS 6. Estou apenas usando:
[self setTitle:text forState:UIControlStateNormal];
Eu preferiria que isso aconteça instantaneamente e sem uma moldura em branco. Esse piscar é especialmente perturbador e desvia a atenção de outras animações.
self.button.titleLabel.text = text
. Mas isso não redimensionar quadro rótulo e não funcionam com UIControlStates corretamenteRespostas:
Isso funciona para botões personalizados:
Para os botões do sistema, você precisa adicioná-lo antes de reativar as animações (obrigado @Klaas):
fonte
[_button layoutIfNeeded];
Use o
performWithoutAnimation:
método e, em seguida, force o layout a acontecer imediatamente e não mais tarde.fonte
[button layoutIfNeeded];
dentro do bloco.Altere o tipo de botão para o construtor de interface de formulário customizado.
Isso funcionou para mim.
fonte
No Swift você pode usar:
fonte
layoutIfNeeded()
, em seguida, o botão é sinalizado como a necessidade de ser redesenhado, mas isso não vai acontecer até o passe seguinte layout, que será fora doperformWithoutAnimation
Observe :
quando " buttonType " de _button é "UIButtonTypeSystem" , o código abaixo é inválido :
quando " buttonType " de _button é "UIButtonTypeCustom" , o código acima é válido .
fonte
A partir do iOS 7.1, a única solução que funcionou para mim foi inicializar o botão com o tipo
UIButtonTypeCustom
.fonte
então eu acho solução trabalhada:
primeiro, mudamos o título do botão e redimensionamos o botão para este título
fonte
Defina o tipo de botão como UIButtonTypeCustom e ele parará de piscar
fonte
Swift 5
fonte
Eu fiz uma extensão Swift para fazer isso:
Funciona para mim no iOS 8 e 9, com
UIButtonTypeSystem
.(O código é para Swift 2, Swift 3 e Objective-C devem ser semelhantes)
fonte
Defina o tipo de UIButton como personalizado. Isso deve remover as animações de fade in e out.
fonte
Normalmente, basta definir o tipo de botão como Personalizado funciona para mim, mas por outros motivos, precisei subclassificar UIButton e definir o tipo de botão novamente para o padrão (Sistema), para que o pisque reapareça.
Definir
UIView.setAnimationsEnabled(false)
antes de alterar o título e depois retornar a verdade depois disso não evitou piscar para mim, não importa se eu chamasseself.layoutIfNeeded()
ou não.Isso, e somente isso na seguinte ordem exata, funcionou para mim no iOS 9 e 10 beta:
1) Crie uma subclasse para o UIButton (não esqueça de definir também a classe personalizada para o botão no Storyboard).
2) Substitua da
setTitle:forState:
seguinte forma:No Interface Builder, você pode deixar o tipo de botão como Sistema, sem precisar alterá-lo para Tipo Personalizado para que essa abordagem funcione.
Espero que isso ajude outra pessoa, lutei por tanto tempo com os botões irritantes que espero evitar isso para os outros;)
fonte
layoutIfNeeded()
:]Você pode simplesmente criar o botão Personalizado e ele irá parar de animar enquanto altera o título.
você também pode fazê-lo na caixa de seleção Storyboard: selecione o botão no storyboard -> selecione o inspetor de atributos (quarto do lado esquerdo) -> no menu suspenso 'Tipo', selecione 'Personalizado' em vez de 'Sistema' que provavelmente foi selecionado .
Boa sorte!
fonte
Você pode remover as animações da camada do rótulo do título:
fonte
Swift 4 versão da resposta Xhacker Liu
fonte
UIButton com
system
type tem animação implícita ativadasetTitle(_:for:)
. Você pode corrigi-lo de duas maneiras diferentes:custom
, no código ou no Interface Builder:fonte
Descobri que essa solução alternativa também funciona com UIButtonTypeSystem , mas só funcionará se o botão estiver ativado por algum motivo.
Portanto, você precisará adicioná-los se precisar que o botão seja desativado ao definir seu título.
(iOS 7, Xcode 5)
fonte
[_button setTitle:@"title" forState:UIControlStateDisabled]
A combinação das excelentes respostas acima resulta na seguinte solução alternativa para o UIButtonTypeSystem :
fonte
Eu tive o problema feio de animação ao alterar os títulos dos botões nos controladores de exibição em um UITabBarController. Os títulos que foram originalmente definidos no storyboard apareceram por um curto período de tempo antes de desaparecer em seus novos valores.
Eu queria percorrer todas as subvisões e usar os títulos dos botões como chaves para obter seus valores localizados com o NSLocalizedString, como;
Eu descobri que o que está desencadeando a animação é realmente a chamada para btn.titleLabel.text. Portanto, para ainda usar os storyboards e ter os componentes localizados dinamicamente dessa maneira, defina a ID de restauração de cada botão (no Identity Inspector) como igual ao título e use-a como chave em vez do título;
Não é o ideal, mas funciona ..
fonte
Na verdade, você pode definir o título fora de um bloco de animação;
layoutIfNeeded()
lembre- se de chamar dentro de um performWithoutAnimation:Se você tiver vários botões, considere apenas chamar
layoutIfNeeded()
a super visão:fonte
A extensão Xhacker Liu convertida para Swift 3:
fonte
Talvez gerar 2 animações e 2 botões seja uma solução melhor, para evitar o problema que aparece com a animação e a alteração do texto de um botão?
Criei um segundo uibutton e gerei 2 animações, esta solução funciona sem hickups.
fonte
Consegui trabalhar com uma combinação de respostas:
fonte
Uma extensão conveniente para a alteração do título do botão animado no Swift que funciona bem com a implementação padrão:
fonte
UIButton
.