UIView transitionFromView:toView:和布局约束

10

如何正确使用[UIView transitionFromView:toView:...]和布局约束?

我想在父视图中安装约束,以限制 toView。但是,在转换调用之前,我无法这样做,因为toView还没有superview。 (同样适用于调用之后但运行循环进展之前。) 等到完成块来安装它意味着视图将在没有约束的情况下进行动画。

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];
}];

从我所看到的情况来看,即使使用了显示/隐藏选项,fromView也会自动从父视图中移除。 - pronebird
1
在调用后查看视图层次结构,fromView 明显没有从 superview 中移除(至少在 iOS 6 和 iOS 7 上)。 - honus
1
似乎要在AutoLayout约束下使用翻转动画,我们必须设置UIViewAnimationOptionShowHideTransitionViews - xi.lin

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接