2012-12-14 15 views
9

Düzen kısıtlamaları olan [UIView transitionFromView:toView:...]'u kullanmanın doğru yolu nedir?UIView geçişiFromView: toView: ve düzen kısıtlamaları

Görüntülemeyi kısıtlayan görünüme kısıtlama yüklemek istiyorum. Geçiş çağrısı yapmadan önce yapamıyorum, çünkü ViewView henüz bir süper görüşüme sahip değil. (Aramadan sonra, ancak çalışma döngüsü ilerlemeden önce aynıdır.) Tamamlama bloğu yüklenene kadar beklemek, görüntünün kısıtlama olmaksızın canlandırılacağı anlamına gelir.

cevap

20

Geçişten önce görünüm hiyerarşisinde hem toView hem de fromView öğelerinin kullanılmasına izin veren UIViewAnimationOptionShowHideTransitionViews seçeneğini kullanırdım, ancak birini gösterir ve diğerini gizler.

Gizlenecek görünüme ayarlayın, süper görünüme ekleyin ve geçişten önce kısıtlamaları yükleyin. Daha sonra eski görünümü tamamlama bloğunda kaldırabilirsiniz. Böyle bir şey:

[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

.. Gördüğümden, fromView, show/hide seçeneği kullanılsa bile otomatik olarak superview'den kaldırıldı. – Andy

+1

Aramadan sonra görünüm hiyerarşisine bakıldığında, fromView süper bir görüntüden (en azından iOS 6 ve iOS 7'de) kaldırılmaz. – honus

+0

Görünüşe göre AutoLayout kısıtlaması ile flip animasyonu kullanmak için 'UIViewAnimationOptionShowHideTransitionViews' ayarlamamız gerekiyor –

0

geçiş çağrısından sonra kısıtlamaları ekleme (ancak çalışma döngüsü önce ilerler) çalışır: Bunun benim önceki testi geçersiz :-(oldu Maalesef gürültü

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; 
} 
İlgili konular