2013-01-07 9 views
8

Próbuję zrobić widok obrazu (logo poniżej) przesuń w górę o 100 pikseli. Używam tego kodu, ale nic się nie dzieje w ogóle:Animowanie widoku obrazu w celu przesunięcia w górę

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:3]; 
logo.center = CGPointMake(logo.center.x, logo.center.y - 100); 
[UIView commitAnimations]; 

Ten kod jest w metodzie viewDidLoad. W szczególności, logo.center = ... nie działa. Inne rzeczy (na przykład zmiana alfa). Może nie używam odpowiedniego kodu, aby przesunąć go w górę?

+0

W metodzie viewDidLoad. Przepraszam za to! –

+1

Czy używasz autolayout? – Rob

+0

Zgodnie z Robem, z kodu podanego w przykładzie wydaje się, że problem z automatycznym układem utrudnia wyświetlanie animacji. Jeśli używasz automatycznego układu, będziesz musiał animować wiązania zamiast jawnie ustawiać ramkę. –

Odpowiedz

42

Dla non-autoLayout storyboardy/stalówki, kod jest w porządku. Nawiasem mówiąc, to generalnie zaleca się, aby animować za pomocą blocks:

[UIView animateWithDuration:3.0 
       animations:^{ 
        self.logo.center = CGPointMake(self.logo.center.x, self.logo.center.y - 100.0); 
       }]; 

Albo, jeśli chcesz trochę większą kontrolę nad opcjami i tym podobne, można użyć:

[UIView animateWithDuration:3.0 
         delay:0.0 
        options:UIViewAnimationCurveEaseInOut 
       animations:^{ 
        self.logo.center = CGPointMake(self.logo.center.x, self.logo.center.y - 100); 
       } 
       completion:nil]; 

Ale kod powinien działać, jeśli nie używasz autolayout. Po prostu powyższa składnia jest preferowana w systemie iOS 4 i nowszych wersjach.

Jeśli używasz autolayout, to (a) utworzyć IBOutlet do ograniczenia przestrzeni pionowej (patrz poniżej), a następnie (b) można zrobić coś takiego:

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

    static BOOL logoAlreadyMoved = NO; // or have an instance variable 

    if (!logoAlreadyMoved) 
    { 
     logoAlreadyMoved = YES; // set this first, in case this method is called again 

     self.imageVerticalSpaceConstraint.constant -= 100.0; 
     [UIView animateWithDuration:3.0 animations:^{ 
      [self.view layoutIfNeeded]; 
     }]; 
    } 
} 

Aby dodać IBOutlet za ograniczenie, tylko kontroli -Przeciągnij z ograniczeniem do swojej ncurses.h w asystent montażysty:

add IBOutlet for vertical constraint

Nawiasem mówiąc, jeśli jesteś animowanie ograniczenie, b Jest wrażliwy na wszelkie inne ograniczenia, które mógłbyś powiązać z tym widokiem. Często, jeśli umieścisz coś tuż pod obrazem, będzie ono wiązało się z obrazem, więc możesz mieć pewność, że nie masz żadnych innych elementów sterujących z ograniczeniami do twojego obrazu (chyba, że ​​chcesz je również przenieść) .

Można powiedzieć, jeśli używasz autolayout otwierając storyboard lub NIB, a następnie wybierając „plik inspektora” (pierwsza zakładka po prawej większości panelu, czy można pociągnąć go naciskając opcję + komenda + (cyfra "1")):

autolayout on

Pamiętaj, jeśli planuje się na wspieraniu wstępną iOS 6, należy wyłączyć "autoLayout". Autolayout jest funkcją iOS 6 i nie działa w starszych wersjach systemu iOS.

+0

Użycie stałej wartości -50 spowoduje wyłączenie widoku z góry ekranu. To, czego chcesz, to oryginalna stała wartość minus 50. – rdelmar

+0

@rdelmar Całkiem dobrze.Przypuszczałem, że to on znika z ekranu, ale oczywiście powinien po prostu zmienić stałą, aby była czymkolwiek, co powinno być. Poprawiłem kod zgodnie z zaleceniami. – Rob

+0

Czy wiesz, dlaczego, jeśli zrobisz to za pomocą przycisku, tytuł animuje się z zewnątrz przycisku do właściwego miejsca? Zauważyłem to wcześniej w niektórych moich eksperymentach z animacją i nie ma to dla mnie żadnego sensu - zakładam, że wszelkie ograniczenia tytułu będą wewnętrzne dla samego przycisku i nie powinny się zmieniać. – rdelmar

-1

mieć u spróbować

logo.frame = CGRectMake(logo.frame.origin.x, logo.frame.origin.y - 100,logo.frame.size.width,logo.frame.size.height) 
Powiązane problemy