如何将 UIViewController 呈现为部分视图?

Posted

技术标签:

【中文标题】如何将 UIViewController 呈现为部分视图?【英文标题】:How to present UIViewController as partial view? 【发布时间】:2017-03-02 22:46:05 【问题描述】:

例如,音乐应用的“正在播放”屏幕和邮件应用的电子邮件撰写屏幕如下所示:

我该如何表达我的观点?我假设仅使用故事板无法实现它,因为所有选项似乎都覆盖了全屏而不是所需的部分模式。

【问题讨论】:

您可以尝试将背景颜色更改为清除(这样您将能够看到下面的viewController)并添加另一个视图(小于主视图)并将其颜色设置为白色。 :) 只是我的想法 【参考方案1】:

这不是最近的问题,所以我把它留作将来使用。希望你已经成功了。

首先,您只需照原样关注this UIPresentationController guide。

然后将呈现的视图控制器框架调整为大于屏幕的2/3。

override func containerViewWillLayoutSubviews() 
    presentedView?.frame = frameOfPresentedViewInContainerView
    presentedView?.layer.cornerRadius = 5.0
    presentedView?.layer.masksToBounds = true


override func size(forChildContentContainer container: UIContentContainer,
                   withParentContainerSize parentSize: CGSize) -> CGSize 
    switch direction 
        case .left, .right:
            return CGSize(width: parentSize.width*(2.0/3.0), height: parentSize.height)
        case .bottom, .top:
            return CGSize(width: parentSize.width, height: parentSize.height-40.0)
    


override var frameOfPresentedViewInContainerView: CGRect 
    var frame: CGRect = .zero
    frame.size = size(forChildContentContainer: presentedViewController,
                withParentContainerSize: containerView!.bounds.size)

    switch direction 
        case .right:
            frame.origin.x = containerView!.frame.width*(1.0/3.0)
        case .bottom:
            frame.origin.y = 40.0
        default:
            frame.origin = .zero
    
    return frame

然后在调光动画期间设置呈现视图控制器框架。

    self.presentingFrame = self.presentingViewController.view.frame
    var frame = self.presentingFrame
    frame.size.width -= 40.0
    frame.size.height -= 60.0
    frame.origin.x += 20.0
    frame.origin.y += 30.0

    coordinator.animate(alongsideTransition:  _ in
        self.dimmingView.alpha = 1.0

        self.presentingViewController.view.frame = frame

        self.presentingViewController.view.layer.cornerRadius = 5.0
        self.presentingViewController.view.layer.masksToBounds = true

        UIApplication.shared.statusBarStyle = .lightContent
    )

不要忘记添加反向动画。结果:

【讨论】:

【参考方案2】:

我假设仅靠情节提要无法实现...

是的,不可能。 评估实现 Custom View Controller Transition Animation 以获得正确的转换,因此它应该只是对呈现的视图控制器的子视图进行 frame & alpha 操作。

【讨论】:

以上是关于如何将 UIViewController 呈现为部分视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何以模态方式呈现标准 UIViewController

如何在将 UIViewController 呈现给自定义时更改默认转换

如何使用完成按钮呈现包含 iOS App Store 的 UIViewController

将UIViewController呈现为UIModalPresentationFormSheet和U IModalPresentationOverCurrentContext

如何在 SKScene 中呈现 UIViewController?

如何访问呈现模态视图的 UIViewController 类/类名?