2

我想要 pageSheet UIModalPresentationStyle segue 的所有功能,但我只希望呈现的 ViewController 显示一半屏幕(参见下图中的示例)。

在此处输入图像描述

我使用 pageSheet modalPresentationStyle 以模态方式呈现它,但它总是以 100% 的高度呈现它。

我无法弄清楚如何限制或修改 ViewController 的高度。我在 SecondViewController 中尝试了以下操作,但没有成功:

import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.preferredContentSize = CGSize(width: self.view.frame.width, height: 400)
    }
} 

我正在使用 Storyboard Segues 和一个以模态方式呈现它的按钮来启动 segue: 在此处输入图像描述

4

3 回答 3

2

我想出了一个办法,我觉得这很简单:

import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let newView = UIView(frame: CGRect(x: 0, y: 500, width: self.view.frame.width, height: 400))
        newView.backgroundColor = .yellow
        newView.layer.cornerRadius = 20

        self.view = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))

        // self.view is now a transparent view, so now I add newView to it and can size it however, I like.

        self.view.addSubview(newView)


        // works without the tap gesture just fine (only dragging), but I also wanted to be able to tap anywhere and dismiss it, so I added the gesture below
        let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        self.view.addGestureRecognizer(tap)
    }

    @objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
        dismiss(animated: true, completion: nil)
    }
}
于 2020-05-04T19:41:34.767 回答
1

为了实现,您需要继承 UIPresentationController 并在呈现控制器中实现协议 UIViewControllerTransitioningDelegate 并将呈现视图控制器的transitioningDelegatemodalPresentationStyle分别设置为 self(呈现视图控制器)和 .custom。实现 UIViewControllerTransitioningDelegate 的一个可选功能:

func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source _: UIViewController) -> UIPresentationController?

并返回自定义的presentationController,它根据您的要求设置呈现控制器的高度。

可能有帮助的基本代码:

class CustomPresentationController: UIPresentationController {
  var presentedViewHeight: CGFloat
  init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?, presentedViewHeight: CGFloat) {
        self.presentedViewHeight = presentedViewHeight
        super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
    }

  override var frameOfPresentedViewInContainerView: CGRect {
        var frame: CGRect = .zero
        frame.size = CGSize(width: containerView!.bounds.width, height: presentedViewHeight)
        frame.origin.y = containerView!.frame.height - presentedViewHeight
        return frame
    }
}

可选功能的实现:

func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source _: UIViewController) -> UIPresentationController? {
        let presentationController = CustomPresentationController(presentedViewController: presented, presenting: presenting, presentedViewHeight: 100)
        return presentationController
    }

您还可以使用其他可选功能并向 CustomPresentationController 添加一些其他功能,例如添加模糊背景、添加点击功能滑动手势

于 2020-05-04T18:40:08.700 回答
0

我们可以在 UIActivityController 中添加我们的视图并删除 UIActivityController 的默认视图,如果您添加导航控制器,那么您也将获得导航,因此您可以通过以下方式完成一半的控制器:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func actionPresent(_ sender: UIBarButtonItem) {
        let vc1 = storyboard?.instantiateViewController(withIdentifier: "ViewControllerCopy")
        let vc = ActivityViewController(controller: vc1!)
        self.present(vc, animated: true, completion: nil)
    }
}


class ActivityViewController: UIActivityViewController {

    private let controller: UIViewController!

    required init(controller: UIViewController) {
        self.controller = controller
        super.init(activityItems: [], applicationActivities: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let subViews = self.view.subviews
        for view in subViews {
            view.removeFromSuperview()
        }

        self.addChild(controller)
        self.view.addSubview(controller.view)
    }
}

例如,您可以查看此仓库: https ://github.com/SomuYadav/HalfViewControllerTransition

于 2020-11-20T16:56:46.107 回答