10

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

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

4

2 に答える 2

23

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];
}];
于 2012-12-14T23:58:16.030 に答える
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;
}
于 2012-12-15T00:20:11.227 に答える