objective-c pubblicità - Come fermare l'animazione UIButton indesiderata sul cambio del titolo?




bloccare sui (17)

In iOS 7 i miei titoli UIButton si animano dentro e fuori al momento sbagliato - tardi. Questo problema non appare su iOS 6. Sto solo usando:

[self setTitle:text forState:UIControlStateNormal];

Preferirei che ciò accadesse all'istante e senza una cornice vuota. Questo battito di ciglia è particolarmente distraente e distoglie l'attenzione dalle altre animazioni.


Answers

Puoi rimuovere le animazioni dal livello dell'etichetta del titolo:

    [[[theButton titleLabel] layer] removeAllAnimations];

quindi trovo la soluzione lavorativa:

_logoutButton.titleLabel.text = NSLocalizedString(@"Logout",);
[_logoutButton setTitle:_logoutButton.titleLabel.text forState:UIControlStateNormal];

in primo luogo cambiamo titolo per pulsante, quindi ridimensiona il pulsante per questo titolo


Imposta il tipo di pulsante su UIButtonTypeCustom e smetterà di lampeggiare


Utilizza il metodo performWithoutAnimation: e quindi performWithoutAnimation: il layout a verificarsi immediatamente anziché in seguito.

[UIView performWithoutAnimation:^{
  [self.myButton setTitle:text forState:UIControlStateNormal];
  [self.myButton layoutIfNeeded];
}];

Ho fatto un'estensione Swift per fare questo:

extension UIButton {
    func setTitleWithoutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, forState: .Normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
}

Funziona per me su iOS 8 e 9, con UIButtonTypeSystem .

(Il codice è per Swift 2, Swift 3 e Objective-C dovrebbe essere simile)


Ho trovato che questa soluzione funziona anche con UIButtonTypeSystem ma funzionerà solo se il pulsante è abilitato per qualche motivo.

[UIView setAnimationsEnabled:NO];
[_button setTitle:@"title" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

Quindi dovrai aggiungere questi se hai bisogno che il pulsante sia disattivato quando imposti il ​​titolo.

[UIView setAnimationsEnabled:NO];
_button.enabled = YES;
[_button setTitle:@"title" forState:UIControlStateNormal];
_button.enabled = NO;
[UIView setAnimationsEnabled:YES];

(iOS 7, Xcode 5)


Ho capito che funziona con una combinazione di risposte:

[[[button titleLabel] layer] removeAllAnimations];

    [UIView performWithoutAnimation:^{

        [button setTitle:@"Title" forState:UIControlStateNormal];

    }];

In Swift puoi usare:

UIView.performWithoutAnimation {
    self.someButtonButton.setTitle(newTitle, forState: .normal)
    self.someButtonButton.layoutIfNeeded()
}

A partire da iOS 7.1 l'unica soluzione che ha funzionato per me è stata l'inizializzazione del pulsante con tipo UIButtonTypeCustom .


Notare che :

quando " buttonType " di _button è "UIButtonTypeSystem" , il codice sottostante non è valido :

[UIView setAnimationsEnabled:NO];
[_button setTitle:@"title" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

quando " buttonType " di _button è "UIButtonTypeCustom" , il codice sopra riportato è valido .


Cambia il tipo di pulsante in Generatore di interfaccia modulo personalizzato.

Questo ha funzionato per me.


Forse generare 2 animazioni e 2 pulsanti è una soluzione migliore, per evitare il problema che si presenta con l'animazione e la modifica del testo di un pulsante?

Ho creato un secondo Uibutton e generato 2 animazioni, questa soluzione funziona senza intoppi.

    _button2.hidden = TRUE;
    _button1.hidden = FALSE;

    CGPoint startLocation = CGPointMake(_button1.center.x, button1.center.y - 70);
    CGPoint stopLocation  = CGPointMake(_button2.center.x, button2.center.y- 70);


    [UIView animateWithDuration:0.3 animations:^{ _button2.center = stopLocation;} completion:^(BOOL finished){_button2.center = stopLocation;}];
    [UIView animateWithDuration:0.3 animations:^{ _button1.center = startLocation;} completion:^(BOOL finished){_button1.center = startLocation;}];

Puoi semplicemente creare un pulsante personalizzato e smetterà di animare mentre cambi il titolo.

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setTitle:@"the title" forState:UIControlStateNormal];

puoi anche farlo nella casella di controllo Storyboard: seleziona il pulsante nello storyboard -> seleziona l'ispettore attributi (quarto da sinistra) -> nel menu a discesa "Tipo", seleziona "Personalizzato" invece di "Sistema" che era probabilmente selezionato .

In bocca al lupo!


Puoi effettivamente impostare il titolo all'esterno di un blocco di animazione, assicurati di chiamare layoutIfNeeded() all'interno di performWithoutAnimation:

button1.setTitle("abc", forState: .Normal)
button2.setTitle("abc", forState: .Normal)
button3.setTitle("abc", forState: .Normal)
UIView.performWithoutAnimation {
    self.button1.layoutIfNeeded()
    self.button2.layoutIfNeeded()
    self.button3.layoutIfNeeded()
}

Se hai un mazzo di pulsanti, considera semplicemente chiamando layoutIfNeeded() nella vista super:

button1.setTitle("abc", forState: .Normal)
button2.setTitle("abc", forState: .Normal)
button3.setTitle("abc", forState: .Normal)
UIView.performWithoutAnimation {
    self.view.layoutIfNeeded()
}

L'estensione Xhacker Liu convertita in Swift 3:

extension UIButton {
    func setTitleWithoutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, for: .normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
}

La combinazione di grandi risposte sopra comporta la seguente soluzione alternativa per UIButtonTypeSystem :

if (_button.enabled)
{
    [UIView setAnimationsEnabled:NO];
    [_button setTitle:@"title" forState:UIControlStateNormal];
    [UIView setAnimationsEnabled:YES];
}
else // disabled
{
    [UIView setAnimationsEnabled:NO];
    _button.enabled = YES;
    [_button setTitle:@"title" forState:UIControlStateNormal];
    _button.enabled = NO;
    [UIView setAnimationsEnabled:YES];
}





objective-c swift ios7 uibutton uikit