2012-12-14 15 views
9

Qual è il modo corretto di utilizzare [UIView transitionFromView:toView:...] con vincoli di layout?Transizione UIViewFromView: toView: e vincoli di layout

Desidero installare i vincoli nel superview limitando toView. Non posso farlo prima della chiamata di transizione dal momento che ViewView non ha ancora una superview. (Lo stesso vale per dopo la chiamata, ma prima che il ciclo di esecuzione proceda.) Attendere fino al blocco di completamento per installarlo significa che la vista avrà animato senza vincoli.

risposta

20

Vorrei utilizzare l'opzione UIViewAnimationOptionShowHideTransitionViews, che consente a toView e fromView di essere nella gerarchia della vista prima della transizione, ma ne mostra uno e nasconde l'altro.

Impostare toView per essere nascosto, aggiungerlo alla superview e installare i vincoli prima della transizione. È quindi possibile rimuovere la vecchia visualizzazione nel blocco di completamento. Qualcosa di simile a questo:

[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

.. Da quello che vedo, fromView rimosso da superview automaticamente anche se l'opzione show/hide è stata utilizzata – Andy

+1

Guardando la gerarchia della vista dopo la chiamata, il fromView non viene rimosso dalla superview (almeno su iOS 6 e iOS 7) – honus

+0

Sembra per utilizzare l'animazione flip con il vincolo AutoLayout, dobbiamo impostare 'UIViewAnimationOptionShowHideTransitionViews' –

0

Aggiungendo i vincoli dopo la chiamata di transizione (ma prima del ciclo corsa progredisce) funziona: la mia prima prova di tutto questo era :-(valida Ci scusiamo per il rumore

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; 
} 
Problemi correlati