UIViewController模态演示后更改尺寸

时间:2019-06-13 05:14:52

标签: ios objective-c uiviewcontroller

我有一个UIViewController,它是使用自定义过渡效果显示的,根据设计,它只能填充屏幕高度的90%。

这看起来不错,而且我从来没有任何问题。我们将其称为“视图A”。现在,我试图在此之上显示全屏模式视图,我们将其称为“视图B”。这种外观有效,但是当视图B被关闭时,视图A再次出现,但已展开以填充视图B。屏幕的整个边界。

这是我正在使用的演示代码:

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
{
    ...
    // Presentation
    const CGFloat viewHeight = (screenBounds.size.height * 0.9);
    const CGRect beginFrame = CGRectMake(0, screenBounds.size.height, screenBounds.size.width, viewHeight);
    const CGRect finalFrame = CGRectMake(0, (screenBounds.size.height - viewHeight), screenBounds.size.width, viewHeight);

    // Dim
    self.dimmedView.alpha = 0.0;
    [transitionContext.containerView addSubview:self.dimmedView];
    [transitionContext.containerView addConstraints:[NSLayoutConstraint allConstraintsFromViewToSuperview:self.dimmedView inset:UIOffsetZero]];

    // Prepare
    UIView * const toView = toVC.view;
    toView.frame = beginFrame;
    [transitionContext.containerView addSubview:toView];

    // Animate
    [UIView animateWithDuration:kAnimationDuration delay:0.0 usingSpringWithDamping:0.8 initialSpringVelocity:0.25 options:0 animations:^{
        toView.frame = finalFrame;

        self.dimmedView.alpha = 0.6;

        self.tabBarController.view.layer.cornerRadius = 8.0;
        self.tabBarController.view.transform = CGAffineTransformMakeScale(0.95, 0.95);
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:!transitionContext.transitionWasCancelled];
        [offshootView removeFromSuperview];
    }];
    ...
}

以前有人看过吗,知道如何停止调整视图A的大小吗?

1 个答案:

答案 0 :(得分:0)

我认为问题是您修改了视图控制器根视图的大小,尽管它是由视图控制器处理的。 UIViewController的文档说:

  

视图控制器的根视图的大小始终适合其分配的大小   空间。

为什么不将另一个(完全透明的)视图作为子视图添加到放置所有内容的根视图中?这样一来,您可以将根视图保持在100%,同时根据需要将新视图的大小更改为90%。如果我对您的理解正确,那么无需触摸根视图即可完成相同的操作。

为此,您应该在Storyboard属性检查器中将视图控制器的Presentation属性设置为Over Full Screen。如果要通过代码进行设置,请设置视图控制器的.modalPresentationStyle = UIModalPresentationOverFullScreen。通过设置此选项,底层的视图控制器将在您呈现视图控制器之后保留在屏幕上,并在您的视图具有透明性的地方继续显示。

Documentation for UIViewController

Documentation for UIModalPresentationOverFullScreen