2012-12-14 11 views
7

Mam problemy z transitionWithView i animateWithDuration. Jeden z moich bloków animateWithDuration nie przechodzi, jest to nagła zmiana, a transitionWithView nie wyłącza czasowo interakcji użytkownika. Sprawdziłem dokumenty i wierzę, że robię wszystko poprawnie, ale oczywiście coś jest nie tak. Oto dwa bloki kodu:Problemy z przejściem z ViewView i animateWithDuration

Jest to mój główny kontroler widoku ViewController, który ma trzy widoki kontenerów/kontrolery widoku podrzędnego. Ten blok przenosi jeden z widoków kontenera, ale nie blokuje użytkownika z innych interakcji w trakcie ViewController podczas przejścia.

[UIView transitionWithView:self.view duration:0.5 options:UIViewAnimationOptionCurveEaseOut animations:^ { 
     CGRect frame = _containerView.frame; 
     frame.origin.y = self.view.frame.size.height - _containerView.frame.size.height; 
     _containerView.frame = frame; 
}completion:^(BOOL finished) { 
    // do something 
}]; 

Jest to jeden z moich kontrolerów widoku kontenerów. Animacja wydaje się nie mieć wpływu, ponieważ zmienia się nagle tekst, tak jakby blok animacji nie istniał.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    [self.viewController toggleFlavoredOliveOilsTableView]; 

    if (indexPath.row > 0) { 
     NSDictionary *selectedCellDict = [[_flavoredOliveOilsDict objectForKey:@"Unflavored Olive Oils"] objectAtIndex:indexPath.row - 1]; 

     [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^ { 
      self.viewController.productTitleLabel.text = [_flavoredOliveOilsTableView cellForRowAtIndexPath:indexPath].textLabel.text; 
      self.viewController.productDescriptionTextView.text = [selectedCellDict objectForKey:@"Description"]; 
     }completion:nil]; 

     if (indexPath.row == 1) { 
      [self.viewController setProductDescriptionTextViewFrameForInformationTab]; 
     } 
     else { 
      [self.viewController setProductDescriptionTextViewFrameForNonInformationTab]; 

      //self.viewController.productImageView.image = [UIImage imageNamed:[selectedCellDict objectForKey:@"Image"]]; 
     } 
    } 
} 

Myślę, że problemy są w pewnym stopniu powiązane, ponieważ większość animacji i bloków przejściowych nie działa zgodnie z oczekiwaniami. Dzięki za pomoc.

Edit

Co usiłuję osiągnąć porusza widok pojemnika w ViewController i ustawić właściwości tekstowe i graficzne etykiety, widoku tekstu, a także wyświetlać obraz; z których wszystkie są w widoku głównym. Szczegóły tych właściwości są wysyłane za pośrednictwem kontrolera widoku podrzędnego. transitionWithView jest w metodzie o nazwie toggleFlavoredOiveOilsTableView, która jest wywoływana w didSelectRowAtIndexPath. Myślę, że problem polega na tym, że próbuję wywołać dwa różne bloki animacji/przejścia w tym samym czasie.

Odpowiedz

13

Możesz doświadczyć tego zachowania dwóch animacji interferujących ze sobą, jeśli jedna animacja jest wykonywana na podglądzie innego widoku poddawanego animacji. Dlatego jeśli wykonasz transitionWithView:self.view (tj. W widoku głównym), jak sugeruje twój fragment kodu, możesz mieć problemy. Jeśli wykonasz dwie animacje na różnych subviewsach, problem może zniknąć. W moim oryginalnym odpowiedź poniżej, I:

  • Wykonaj transitionWithView na podrzędny, który ma dwa UILabel kontroli;

  • Umieść moje widoki kontrolera ograniczające widok podrzędne w widoku głównym widoku głównego, a następnie transitionFromViewController jest ograniczone do tego widoku podrzędnego.

Kiedy kładę dwa animowane fragmenty dotyczące różnych subviews, animacje mogą odbywać się równocześnie bez incydentu.


Jeśli chcesz animować zmianę zawartości dwóch etykiet tekstowych, można:

[UIView transitionWithView:self.viewController.textLabelsContainerView 
        duration:0.5 
        options:UIViewAnimationOptionTransitionCrossDissolve 
       animations:^{ 
        self.viewController.productTitleLabel.text = [_flavoredOliveOilsTableView cellForRowAtIndexPath:indexPath].textLabel.text; 
        self.viewController.productDescriptionTextView.text = [selectedCellDict objectForKey:@"Description"]; 
       } 
       completion:nil]; 

Ogólnie bym użyć animateWithDuration, ale atrybut tekst nie jest własnością animatable, więc dlatego używam transitionWithView, upewniając się, że mam pojemnik dla tych pól tekstowych. Ale próbowałem animować inne formanty za pomocą animateWithDuration, jednocześnie animując zmiany kontrolerów podrzędnych, i to działa dobrze.

Do zmiany kontrolerów widoku podrzędnego używam transitionFromViewController do animowania zamiany widoków kontrolera podrzędnego kontenerów (jest to część rodziny metod Managing Child View Controllers in a Custom Container). Aby ułatwić ten proces, umieszczam widok kontenera w widoku głównego kontrolera widoku i dodam widoki kontrolera podrzędnego jako widok podrzędny tego kontenera. W ten sposób, gdy animuję przejście dziecka, animacje są ładnie ograniczone do tego widoku kontenera.

Tak, tu jest jakiś przykładowy kod, aby dodać kontroler widoku do mojego widoku kontenera, a następnie kod używam do przejścia między dwoma widoku dziecko kontrolerów za pomocą segmentową przycisk:

- (void)addFirstChild 
{ 
    UIViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"Stooge"]; 
    [self addChildViewController:child]; 

    child.view.frame = self.bottomContainerView.bounds; 
    [self.bottomContainerView addSubview:child.view]; 

    [child didMoveToParentViewController:self]; 
} 

- (void)changedChild 
{ 
    UIViewController *oldController = [self.childViewControllers lastObject]; 
    UIViewController *newController; 

    if (self.segmentedControl.selectedSegmentIndex == 0) 
     newController = [self.storyboard instantiateViewControllerWithIdentifier:@"Stooge"]; 
    else 
     newController = [self.storyboard instantiateViewControllerWithIdentifier:@"Marx"]; 

    [oldController willMoveToParentViewController:nil]; 
    [self addChildViewController:newController]; 

    // start off screen below 

    CGRect startFrame = self.bottomContainerView.bounds; 
    startFrame.origin.y += startFrame.size.height; 

    // end up where it's supposed to be, right in the container 

    newController.view.frame = startFrame; 

    [self transitionFromViewController:oldController 
         toViewController:newController 
           duration:0.5 
           options:0 
          animations:^{ 
           newController.view.frame = self.bottomContainerView.bounds; 
          } 
          completion:^(BOOL finished) { 
           [oldController removeFromParentViewController]; 
           [newController didMoveToParentViewController:self]; 
          }]; 

} 

Konkluzja, ja nie ma problemu z animowaniem obu kontrolerów potomnych kontenera i pól w kontrolerze nadrzędnym. Być może nie rozumiem problemu, który opisujesz. A może jest coś subtelnego w różnicach w animowaniu. Jeśli chcesz, umieściłem this above code na github, jeśli chcesz rzucić okiem.

+0

Jeśli chcesz animować obie etykiety w tym samym czasie, umieść dwie etykiety we własnym widoku kontenera etykiet, a następnie użyj go jako pierwszego parametru do "transitionWithView". – Rob

+0

Mam jeden z nich częściowo działa poprawnie teraz. Czy nie można łączyć "animateWithDuration" i "UIViewAnimationOptionTransitions" lub łączyć przejścia "transitionWithView" i "UIViewAnimationOptions" (non-transition)? Wydaje się, gdy mam te, które nie działają, ale jeśli używam opcji przejścia z 'transitionWithView' to działa, i podobnie z animacjami. Przeczytałem dokumenty i wydaje się, że można je wszystkie połączyć, ale to nie zadziałało. –

+0

Zobacz poprawione pytanie. Dzięki –