2012-12-14 15 views
9

[UIView transitionFromView:toView:...]とレイアウトの制約を使用する正しい方法は何ですか?UIView transitionFromView:toView:レイアウトの制約

スーパービューの制約toViewに制約をインストールしたいとします。私は、toViewがまだスーパービューを持っていないので、遷移呼び出しの前にそれを行うことはできません。 (呼び出し後でも、実行ループが進む前と同じです。)インストール完了ブロックまで待つと、ビューは制約なしでアニメーション化されます。

答えて

20

私はUIViewAnimationOptionShowHideTransitionViewsオプションを使用します。これにより、toViewとfromViewの両方が遷移前にビュー階層内にあることができますが、一方が表示され、他方が非表示になります。

toViewを非表示に設定し、スーパービューに追加し、移行前に制約をインストールします。その後、完了ブロック内の古いビューを削除することができます。このような何か:

[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

。 show/hideオプションが使用されても、fromViewがスーパービューから自動的に削除されました。 – Andy

+1

呼び出し後のビュー階層を見ると、fromViewは(少なくともiOS 6とiOS 7では)スーパービューから挑戦的に削除されません – honus

+0

AutoLayout制約でフリップアニメーションを使用するには、 'UIViewAnimationOptionShowHideTransitionViews'を設定する必要があります –

0

遷移コールの後に制約を追加する(ただし、実行ループが進行する前には)動作します。それの私の以前のテストが無効:-(たノイズのために申し訳ありません

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; 
} 
関連する問題