2012-12-06 14 views
21

Chcę przenieść widok z jednego świetnym miejscu do drugiego, można wdrożyć go za pomocąAnimowanie/Moving widoki pod wykorzystaniem autoLayout

self.view.center = CGPointMake(100, 200); 

jednak, jeśli projekt jest przy użyciu autoLayout, to widok będzie z powrotem do oryginalnej pozycji po uruchomieniu:

[self.view.superview setNeedsLayout]; 

to jak właściwie przenieść widok do nowej pozycji?

Odpowiedz

14

Musisz zmienić ograniczenia, jeśli korzystasz z funkcji AutoLayout. Sugerowany sposób polega na utworzeniu ujścia w kontrolerze widoku wiązań, a następnie zmianie stałej wiązania. Jeśli masz czas, zdecydowanie polecam going here i oglądam "Automatyczny układ według przykładu" lub "Najlepsze praktyki w opanowaniu automatycznego układu". Bardzo mi pomogli. Myślę, że punktem wyjścia jest to, że z autoLayout nie myślisz już w kategoriach ramek. Więc ustawienie centrum po prostu nie działa z automatycznym układem. Chodzi o to, jak widoki są ze sobą powiązane.

+0

brzmi to, że za pomocą autolayout jest trudniejsze niż za pomocą ramki, aby przenieść widoku, ponieważ powinienem dostać wszystkie wyloty tego widoku – user1687717

+0

trudniej jest na początku, ale ja rzeczywiście zaczynają podoba to lepiej.Możesz zrobić o wiele więcej dzięki temu. –

+0

Drugi @ClintWarner tutaj: Autolayout może być odrobinę trudniejszy do ustawienia początkowo, ale przynosi ogromne korzyści pod względem utrzymania i czytelności. Teraz jestem przyzwyczajony do wprowadzania ograniczeń, praca z matematyką ramową wydaje się nużąca i frustrująca. – followben

31

Z AutoLayout włączona, powinniśmy FORGET FRAMES i tylko CONSIDER CONSTRAINTS .Yes na animowanie również nie może już zmienić ramkę lub centrum, widok będzie powrócić do pierwotnej pozycji, gdy układ jest tzw.

Zamiast tego powinieneś uzyskać consider changing the constant value of the constraint, aby uzyskać ten sam efekt.

Rozważ interfejs użytkownika podobny do obrazu podanego poniżej. Mam widok obrazu z numerem 20 points leading space from it's superview, co oznacza, że ​​ma on ograniczoną przestrzeń poziomą z jego widokiem. Ponadto mam trzy dodatkowe ograniczenia związane z tym widokiem obrazu, góra, szerokość i wysokość.

Pokażę ci, jak możemy animować obraz od lewej do prawej, jak pokazano na obrazku.

Utwórz IBOutlet dla ograniczeń, które musimy animować. Dopóki używamy tylko ograniczania przestrzeni poziomej, wystarczy przesunąć ten widok z lewej do prawej.

@property (weak, nonatomic) IBOutlet UIImageView *imageView; 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *horizontalSpaceConstraint; 

enter image description here

Wewnątrz Go Away działania, musimy zaktualizować stałą wartość tego ograniczenia.

- (IBAction)moveFrontAction:(id)sender { 
    self.horizontalSpaceConstraint.constant = 220; 

    [UIView animateWithDuration:0.5 animations:^{ 
     [self.imageView layoutIfNeeded]; 
    }]; 
} 

Teraz widok powinny zostać przeniesione do prawej end.I'm właśnie robi, że wewnątrz bloku animacji więc będziemy mogli zobaczyć piękny animacji od lewej do prawej i vice versa.In produkcji, nie powinno się tak mocno kodować takich wartości.Tylko robimy to tutaj, aby wyjaśnić tę koncepcję.

enter image description here

Wewnątrz działania Come Back, jesteśmy znowu resetowanie stały z powrotem do jego pierwotnej wartości, dzięki czemu można zobaczyć pomarańczowy obraz animacji z powrotem do pierwotnego położenia.

- (IBAction)moveBackAction:(id)sender { 
    self.horizontalSpaceConstraint.constant = 20; 

    [UIView animateWithDuration:0.5 animations:^{ 
     [self.imageView layoutIfNeeded]; 
    }]; 
} 
+0

Dziękuję, że to rozwiązało mój problem. – jdog

+0

Hej użytkownik1687717 chce przewinąć widok za pomocą metod dotykowych widoku, nie używając animowanego stylu .. –

+1

Przed zmianą stałej ograniczenia lepiej jest wywołać '[self.imageView layoutIfNeeded]'. tutaj to nie ma żadnego wpływu, ale na prawdziwych projektach może być inne animowanie w biegu. więc twój imageview musi khow swoją ostatnią klatkę przed animacją. '(IBAction) moveBackAction: (id) nadawca { [self.imageView layoutIfNeeded]; self.horizontalSpaceConstraint.constant = 20; [UIView animateWithDuration: 0.5 animacje:^{ [self.imageView layoutIfNeeded]; }]; } ' –

Powiązane problemy