[UIView transitionFromView:toView:...]
レイアウト制約を使用する正しい方法は何ですか?
toViewを制約するスーパービューに制約をインストールしたい。toView にはまだスーパービューがないため、遷移呼び出しの前にそれを行うことはできません。(呼び出しの後、実行ループが進行する前でも同じです。) 完了ブロックがインストールされるまで待機するということは、ビューが制約なしでアニメーション化されることを意味します。
[UIView transitionFromView:toView:...]
レイアウト制約を使用する正しい方法は何ですか?
toViewを制約するスーパービューに制約をインストールしたい。toView にはまだスーパービューがないため、遷移呼び出しの前にそれを行うことはできません。(呼び出しの後、実行ループが進行する前でも同じです。) 完了ブロックがインストールされるまで待機するということは、ビューが制約なしでアニメーション化されることを意味します。
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];
}];
遷移呼び出しの後 (ただし、実行ループが進行する前) に制約を追加すると機能します。以前のテストは無効でした :-(。ノイズで申し訳ありません。
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;
}