【问题标题】:UIView transitionFromView:toView: and layout constraintsUIView transitionFromView:toView: 和布局约束
【发布时间】:2012-12-15 08:20:11
【问题描述】:

[UIView transitionFromView:toView:...] 与布局约束一起使用的正确方法是什么?

我想在超级视图中安装约束来约束 toView。在转换调用之前我不能这样做,因为 toView 还没有超级视图。 (在调用之后但在运行循环进行之前也是如此。)等到完成块安装它意味着视图将具有动画而没有约束。

【问题讨论】:

    标签: ios nslayoutconstraint


    【解决方案1】:

    我会使用 UIViewAnimationOptionShowHideTransitionViews 选项,它允许 toView 和 fromView 在转换之前位于视图层次结构中,但显示一个并隐藏另一个。

    设置toView为隐藏,添加到superview中,在transition前安装约束。然后,您可以删除完成块中的旧视图。像这样的:

    [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 也会自动从超级视图中删除。
    • 在调用后查看视图层次结构,fromView 显然没有从超级视图中删除(至少在 iOS 6 和 iOS 7 上)
    • 看来要使用带有AutoLayout约束的翻转动画,我们必须设置UIViewAnimationOptionShowHideTransitionViews
    【解决方案2】:

    在转换调用之后(但在运行循环进行之前)添加约束有效:我之前的测试无效 :-(。对不起,噪音。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多