21

To jest projekt iPada, na którym mam UIView z kilkoma subViews i próbuję animować jeden z tych UIViews za pomocą [UIView transitionFromView: toView: duration: options : zakończenie], ale kiedy uruchomię tę metodę, cały widok rodzicielski zostanie odwrócony! Jest to kod używam:Jak odwrócić pojedyncze UIView (bez odwracania widoku nadrzędnego)

UIView *secondView = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 300, 300)]; 
[newView setBackgroundColor:[UIColor redColor]]; 
    [UIView transitionFromView:self.firstView.view toView:secondView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 

Każdy pomysł, w jaki sposób mogę przerzucić między tym widokiem bez animacji cały widok rodzicem? Dzięki!

Odpowiedz

70

Kod ten umożliwia:

umieścić dwa widoki, które chcesz obrócić wewnątrz nienazwanej widzenia z tej samej wielkości oraz link IBOutlet UIView *newView,*oldView; do poglądów i umieścić nowy widok na górę

bool a = NO; 

@implementation ViewController 

- (IBAction)flip:(id)sender 
{ 
    if (a == NO) { 
     [UIView transitionFromView:oldView toView:newView 
        duration:1.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
        completion:NULL]; 
     a = YES; // a = !a; 
    } 
    else { 
     [UIView transitionFromView:newView toView:oldView 
        duration:1.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
        completion:NULL]; 
     a = NO; // a = !a; 
    } 
} 
+5

Dzięki wielkie! Rozwiązaniem było użycie widoku kontenera. – DanMunoz

+0

@ Floris497, uratowałeś mój dzień. Wielkie dzięki :) – Ahmed

+1

Dzięki za to. Miałem przeczucie, że to jest rozwiązanie. Domyślam się, że przejście jest bardziej podstępem, robi animację klapki na widoku nadrzędnym, aw połowie zamienia podrzędne widoki, które określasz. Z drugiej strony, większość animacji itp. Na iPhone'a to podstęp :-) – Dermot

2

Skorzystaj z widoku kontenera, aby zatrzymać subviews, a widok kontenera powinien mieć taki sam rozmiar, co widok ankiety, którą próbujesz animować.

Możesz więc ustawić swoje widoki w ten sposób.

self.view-> „rzutem pojemnik” -> subviews

2
**//flipping view continuously** 



bool a = NO; 


-(void)viewDidLoad 
{ 



// THIS is the canvass holding the two views this view is flipping 
UIView *v=[[UIView alloc]initWithFrame:CGRectMake(40, 40, 150, 150)]; 

    v.backgroundColor=[UIColor clearColor]; 

    [self.view addSubview:v]; 

    [v addSubview:yourfirstview]; 
    [v addSubview:yoursecondview]; 

// calling the method 

[NSTimer scheduledTimerWithTimeInterval:2.0 
            target:self 
            selector:@selector(flip) 
            userInfo:nil 
            repeats:YES]; 

} 



//flipping view randomly 

-(void)flip 

{ 

if (a == NO) 
{ 

[UIView transitionFromView:yourfirstview toView:yoursecondview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; 
     a = YES; 
    } 

else if(a==YES) 
{ 

[UIView transitionFromView:yoursecondview toView:yourfirstview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; 
    a = NO; 
    } 

} 
37

miałem problemy getting to do pracy również. Użyłem kodu napisanego przez Florisa, ale chociaż zadziałało to przy pierwszej "klapce" następna klapka zaczęła dziwnie wyglądać, gdzie guziki i etykiety na przednim UI View straciły tam pozycje.

Umieszczam kod poniżej na miejscu i działa poprawnie.

Kilka rzeczy do uwaga:

  1. PANELVIEW jest kontrola UIView na ViewController który ma dwa inne UIViews zagnieżdżone wewnątrz niego (subviews). Pierwszy nazywa się frontView, drugi nazywa się backView. (Patrz zdjęcie poniżej)

image of the view and subviews in IB

  1. Mam właściwość bool nazwie displayingFront od klasy

(w moim .h)

@property BOOL displayingFront; 

w moim .m

@synthesize displayingFront; 

w moim sposobie viewDidLoad

self.displayingFront = YES; 

Jest to kod w .m że mam sklecany do dwóch przycisków jeżeli UIViews przodu i tyłu ...

- (IBAction)flip:(id)sender 
{ 
    [UIView transitionWithView:self.panelView 
         duration:1.0 
         options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : 
           UIViewAnimationOptionTransitionFlipFromLeft) 
        animations: ^{ 
         if(displayingFront) 
         { 
          self.frontView.hidden = true; 
          self.backView.hidden = false; 
         } 
         else 
         { 
          self.frontView.hidden = false; 
          self.backView.hidden = true; 
         } 
        } 

        completion:^(BOOL finished) { 
         if (finished) { 
          displayingFront = !displayingFront; 
         } 
        }]; 
} 
+0

Myślę, że to jest bardziej czyste niż odpowiedź – RonPelayo

+0

Różnica w stosunku do tego podejścia polega na tym, że animacje pojawiają się po odwróceniu ... więc frontView jest ukryty, a backView wyświetlany po odwróceniu. Podejście "transitionFromView" opisane powyżej dodaje widok w punkcie środkowym, więc przed zakończeniem klapki wyświetla się "toView". – wuf810

+0

Dzięki! To rozwiązało moje problemy z niewłaściwie umieszczonymi subskrybcjami zmieniających się widoków (etykiet). Rozrzucono je po ekranie. –

2

naprawiłem ten problem za pomocą animacji starej szkoły:

[UIView beginAnimations:@"Flip" context:nil]; 
[UIView setAnimationDuration:1]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:firstView cache:YES]; 

[self addSubview:secondView]; 

[UIView commitAnimations]; 

Dodatkowo można usunąć firstView:

[firstView removeFromSuperview]; 
Powiązane problemy