Quando chamo setTitle em um UIButton, o botão pisca no iOS 7. Tentei definir myButton.highlighted = NO, mas isso não impediu que o botão pisque.
[myButton setTitle:[[NSUserDefaults standardUserDefaults] stringForKey:@"elapsedLabelKey"] forState:UIControlStateNormal];
myButton.highlighted = NO;
Aqui está como eu configurei o cronômetro que atualizou os títulos:
- (void)actionTimer {
if (myTimer == nil) {
myTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0
target: self
selector: @selector(showActivity)
userInfo: nil
repeats: YES];
}
}
Aqui está o método que realmente atualiza os títulos:
- (void)showActivity {
NSString *sym = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol];
if (pauseInterval == nil) {
// Update clock
seconds = [[NSDate date] timeIntervalSinceDate:startInterval] - breakTime;
// Update total earned
secRate = rate.value / 60 / 60;
total = secRate * seconds;
[totalLabel setTitle:[NSString stringWithFormat:@"%@%.4f",sym,total] forState:UIControlStateNormal];
days = seconds / (60 * 60 * 24);
seconds -= days * (60 * 60 * 24);
int hours = seconds / (60 * 60);
fhours = (float)seconds / (60.0 * 60.0);
seconds -= hours * (60 * 60);
int minutes = seconds / 60;
seconds -= minutes * 60;
// Update the timer clock
[elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
}
}
Respostas:
Defina o tipo de botão como UIButtonTypeCustom e ele parará de piscar
fonte
Uma abordagem melhor do
[UIView setAnimationsEnabled:NO]
que aquela que pode afetar outras animações é desativar apenas a animação do título específico.Objective-C:
Rápido:
fonte
* Observe *
quando " buttonType " de _button é "UIButtonTypeSystem" , o código abaixo é inválido :
quando " buttonType " de _button é "UIButtonTypeCustom" , o código acima é válido .
fonte
Veja as respostas de Como parar a animação UIButton indesejada na mudança de título? :
fonte
layoutIfNeeded
:[elapsed layoutIfNeeded];
. Isso removeu o piscar no meu caso.layoutIfNeeded
parece estar funcionandoVocê pode simplesmente criar outra função para UIButton para facilitar o uso futuro.
É isso!
E apenas defina o título como faria antes, mas substitua
setTitle
porsetTitleWithoutAnimation
fonte
O comportamento padrão "setTitle" é definitivamente odioso!
Minha solução é:
Além disso, no storyboard, na propriedade do botão, desmarco:
E verifique:
Testado e funcionando no iOS 8 também.
Atualizar - Swift
Eu sugiro que você crie seu botão personalizado e substitua o método setTitle .
fonte
Experimente isto, funciona em versões mais recentes do IOS:
fonte
Eu sou novo em codificação e Stackoverflow, então não tenho reputação o suficiente para comentar diretamente e expandir https://stackoverflow.com/users/4673064/daniel-tseng excelente resposta. Portanto, tenho que escrever minha própria nova resposta, e é esta:
Funciona muito bem, EXCETO:
Se todas as minhas chamadas posteriores no código para "setTitleWithoutAnimation" não especificarem um remetente, recebo essas mensagens estranhas relacionadas a CoreMedia ou CoreData, por exemplo, "Falha ao herdar permissões CoreMedia de 2526: (nulo)"
Isso é provavelmente muito básico para codificação e iOS, mas para mim, como um novo programador, me deixou em uma trilha de coelho por um tempo, como em: Hoje a extensão falhou ao herdar as permissões do CoreMedia , onde as pessoas tinham respostas interessantes, mas NÃO chegar à raiz do meu problema.
Então, finalmente descobri que precisava passar e fornecer parâmetros às minhas funções sem parâmetros, ou seja, eu precisava especificar um remetente. Esse remetente pode ser UIButton, Any ou AnyObject. Tudo isso funcionou, mas no final das contas parece haver um conflito entre adicionar uma extensão de botão com "self" e não dizer especificamente mais tarde que um botão a está usando.
Novamente, provavelmente básico, mas novo para mim, então achei que valeria a pena compartilhar.
fonte
Outro truque
Isso funciona apenas se você souber o valor do título sem fazer chamadas de API. O título do botão serádefinido antes de a vista ser carregada, por isso não verá a animação
fonte