如何正确使用[UIView transitionFromView:toView:...]
和布局约束?
我想在父视图中安装约束,以限制 toView
。但是,在转换调用之前,我无法这样做,因为toView
还没有superview。 (同样适用于调用之后但运行循环进展之前。) 等到完成块来安装它意味着视图将在没有约束的情况下进行动画。
如何正确使用[UIView transitionFromView:toView:...]
和布局约束?
我想在父视图中安装约束,以限制 toView
。但是,在转换调用之前,我无法这样做,因为toView
还没有superview。 (同样适用于调用之后但运行循环进展之前。) 等到完成块来安装它意味着视图将在没有约束的情况下进行动画。
我会使用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;
}
UIViewAnimationOptionShowHideTransitionViews
。 - xi.lin