2012-12-14 14 views
9

Jaki jest poprawny sposób używania [UIView transitionFromView:toView:...] z ograniczeniami układu?UIView transitionFromView: toView: i ograniczenia layoutu

Chcę zainstalować ograniczenia w widoku podglądu ograniczającym toView. Nie mogę tego zrobić przed rozmową przejściową, ponieważ to ViewView nie ma jeszcze podglądu. (To samo dotyczy po wywołaniu, ale przed postępowaniem pętli uruchamiania.) Oczekiwanie na zakończenie instalacji, oznacza, że ​​widok będzie animowany bez ograniczeń.

Odpowiedz

20

Użyłbym opcji UIViewAnimationOptionShowHideTransitionViews, która umożliwia zarówno widok widoków i widoków z widoku w hierarchii widoku przed przejściem, ale pokazuje jeden i ukrywa drugi.

Ustaw jako widok, aby był ukryty, dodaj go do superwizji i zainstaluj wiązania przed przejściem. Następnie możesz usunąć stary widok w bloku zakończenia. Coś takiego:

[toView setHidden: YES]; 
[containerView addSubview: toView]; 
[containerView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"|[toView]|" options: 0 metrics: nil views: NSDictionaryOfVariableBindings(containerView, toView)]]; 
[containerView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"V:|[toView]|" options: 0 metrics: nil views: NSDictionaryOfVariableBindings(containerView, toView)]]; 

[UIView transitionFromView: fromView toView: toView duration: 1.0 options: UIViewAnimationOptionTransitionFlipFromBottom | UIViewAnimationOptionShowHideTransitionViews completion:^(BOOL finished) { 
    [fromView removeFromSuperview]; 
}]; 
+0

.. Z tego co widzę, automatycznie usunięto widok z widoku z podglądu, nawet jeśli użyto opcji pokaż/ukryj – Andy

+1

Patrząc na hierarchię widoku po wywołaniu, outView nie jest wyzywająco usunięty z superwizja (przynajmniej na iOS 6 i iOS 7) – honus

+0

Wygląda na to, aby użyć animacji klapki z ograniczeniem AutoLayout, musimy ustawić 'UIViewAnimationOptionShowHideTransitionViews' –

0

Dodawanie ograniczeń po zakończeniu rozmowy przejściowym (ale przed pętli biegu postępuje) działa: my przed testem, który był nieważny :-(Przepraszamy za hałas

NSArray *priorConstraints = _constraints; 
    [UIView transitionFromView:priorView 
         toView:newView 
         ... 
        completion:^(BOOL finished) { 
         [_containerView removeConstraints:priorConstraints]; 
         .... 
        }]; 
    _constraints = [self constrainSubview:newView toBeCongruentWithSuperview:_containerView]; 


- (NSArray/*[NSLayoutConstraint]*/ *)constrainSubview:(UIView *)subview 
          toBeCongruentWithSuperview:(UIView *)superview { 
    subview.translatesAutoresizingMaskIntoConstraints = NO; 
    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(subview); 

    NSArray *constraints = [NSLayoutConstraint 
          constraintsWithVisualFormat:@"H:-(0)-[subview]-(0)-" 
          options:0 
          metrics:nil 
          views:viewsDictionary]; 
    constraints = [constraints arrayByAddingObjectsFromArray: 
        [NSLayoutConstraint 
        constraintsWithVisualFormat:@"V:-(0)-[subview]-(0)-" 
        options:0 
        metrics:nil 
        views:viewsDictionary]]; 
    [superview addConstraints:constraints]; 
    return constraints; 
}