Как мне создать ViewController, который составляет половину высоты экрана? - PullRequest
0 голосов
/ 04 мая 2020

Я хочу, чтобы вся функциональность pageSheet UIModalPresentationStyle segue, но я хочу, чтобы только представленный ViewController показывал половину экрана (см. Пример на рисунке ниже).

enter image description here

Я представляю его модально, используя 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 и кнопку, которая представляет его модально: enter image description here

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Я нашел способ сделать это, который я считаю довольно простым:

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)
    }
}
0 голосов
/ 04 мая 2020

Для достижения этого вам нужно будет создать подкласс UIPresentationController и реализовать протокол UIViewControllerTransitioningDelegate в представляющем контроллере и установить transitioningDelegate и modalPresentationStyle представленного контроллера представления как самого себя (представление контроллера представления) и .custom соответственно. Реализуйте дополнительную функцию UIViewControllerTransitioningDelegate:

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

и верните пользовательский presentationController, который устанавливает высоту представляемого контроллера в соответствии с вашим требованием.

Базовый c код, который может помочь:

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, такие как добавление размытие фона , добавление нажмите функциональность и жест пальцем .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...