2011-07-20 10 views
5

W mojej metodzie widokuDidLoad umieszczam przycisk po lewej stronie widoku, poza ekranem.setFrame w animacji UIView nie przesuwa się, tylko zatrzaski w miejscu

Potem korzystać z tych dwóch metod, aby go ożywić:

-(void) viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    [self showButton]; 
} 

I metoda:

-(void) showButton { 
    [myButton setTitle:[self getButtonTitle] forState:UIControlStateNormal]; 

    // animate in 
    [UIView beginAnimations:@"button_in" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(animationDone)]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [myButton setFrame:kMyButtonFrameCenter]; // defined CGRect 
    [UIView commitAnimations]; 
} 

Przycisk pojawia się natychmiast i nie animować. Ponadto selektor animacjiDone jest wywoływany natychmiast.

Dlaczego nie animuję mojego przycisku na ekranie?

EDIT: To musi mieć coś wspólnego z próbą uruchomienia animacji podczas gdy w viewDidAppear ...

+0

dziwnie, jeśli trochę poczekać, animacja będzie działać. – TigerCoding

Odpowiedz

6

Próbowałem swój kod animacji i działa dobrze.

Gdzie ustawić ramkę początkową przycisku? Czy możliwe jest, że błędnie ustawiłeś ramkę przycisku na kMyButtonFrameCenter przed rozpoczęciem animacji? To by wyjaśniało, dlaczego selektor animacjiDone jest wywoływany natychmiast.

Oto kod, który działa:

-(void) showButton { 
    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [myButton setTitle:@"test" forState:UIControlStateNormal]; 
    myButton.frame = CGRectMake(-100.0, 100.0, 100.0, 30.0); 
    [self.view addSubview:myButton]; 

    // animate in 
    [UIView beginAnimations:@"button_in" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(animationDone)]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [myButton setFrame:CGRectMake(100.0, 100.0, 100.0, 30.0)]; 
    [UIView commitAnimations]; 
} 

Jak widać nie miałem nic w kodzie animacji zmienić. Myślę więc, że problemem jest klatka przycisku.

Trochę poza tematem: jeśli nie masz aplikacji na system iOS < 4, możesz chcieć rzucić okiem na "animację z blokami" UIView dostarczoną z iOS 4.0.

[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^void{myButton.frame = kMyButtonFrameCenter} completion:^(BOOL completed){NSLog(@"completed");}]; 

=== EDIT ===

Po przeczytaniu Twojego komentarza, wydaje się, że moje podejrzenia nie jest poprawna. inspire48 wskazuje właściwą odpowiedź z jego odpowiedzią. Należy umieścić umieszczenie przycisku wewnątrz metody viewDidAppear lub w metodzie showButton, aby upewnić się, że przycisk jest umieszczony na zewnątrz ekranu przed zadzwonić animację

+0

Próbowałem umieścić go w viewDidAppear, ale nie miał wpływu. Jednak okazało się, że użycie timera z opóźnieniem 0.2 sprawiłoby, że wszystko działało. – TigerCoding

+1

Czy próbowałeś zrobić to tak, jak zrobiłem to w powyższym kodzie? Ponieważ działa. Czy masz dużo UELEMENTÓW, które należy narysować, gdy pojawi się widok? – joern

+0

Tak, właśnie podałem temu wir. Próbowałem ustawić ramkę właśnie tam, ustawiając "centrum" i kilka innych rzeczy. W końcu ustawiłem timer, który wyłączy 0,2 sekundy po viewDidAppear i wszystko działa w ten sposób. Wciąż nie wiem dlaczego. – TigerCoding

3

zawiesić połączenie animacji w viewDidAppear. viewDidLoad służy do większej konfiguracji typu danych. Wszelkie efekty wizualne, takie jak animacje, powinny iść w viewDidAppear. Potwierdziłeś to - działa, jeśli trochę poczekasz.

+0

Wywołanie animacji znajduje się w viewDidAppear, ale być może pomaga również umieścić tam przycisk (przed wywołaniem metody showButton). – joern

+0

Próbowałem umieścić widok przycisku w pierwszej kolejności, ale to nie pomogło. – TigerCoding

Powiązane problemy