Почему не определяет размер контроллера моего представления с помощью frameOfPresentedViewInContainerView?

Я отслеживаю этот учебник по внедрению пользовательских переходов контроллера видимости в iOS 8 с UIPresentationController, и до сих пор все это имеет смысл, но я могу" t, похоже, что мой контроллер просмотра имеет нужный размер.

В этом учебнике у них есть следующий код:

class OverlayPresentationController: UIPresentationController {
   let dimmingView = UIView()

  override init(presentedViewController: UIViewController!, presentingViewController: UIViewController!) {
    super.init(presentedViewController: presentedViewController, presentingViewController: presentingViewController)
    dimmingView.backgroundColor = UIColor(white: 0.0, alpha: 0.5)
  }

  override func presentationTransitionWillBegin() {
    dimmingView.frame = containerView.bounds
    dimmingView.alpha = 0.0
    containerView.insertSubview(dimmingView, atIndex: 0)

    presentedViewController.transitionCoordinator()?.animateAlongsideTransition({
      context in
      self.dimmingView.alpha = 1.0
    }, completion: nil)
  }

  override func dismissalTransitionWillBegin() {
    presentedViewController.transitionCoordinator()?.animateAlongsideTransition({
      context in
      self.dimmingView.alpha = 0.0
    }, completion: {
      context in
      self.dimmingView.removeFromSuperview()
    })
  }

  override func frameOfPresentedViewInContainerView() -> CGRect {
    return containerView.bounds.rectByInsetting(dx: 30, dy: 30)
  }

  override func containerViewWillLayoutSubviews() {
    dimmingView.frame = containerView.bounds
    presentedView().frame = frameOfPresentedViewInContainerView()
  }
}

Я все понимаю, кроме frameOfPresentedViewInContainerView. Это возвращает размер , но, если я удалю presentedView().frame = frameOfPresentedViewInContainerView() в containerViewWillLayoutSubviews, это не сработает. Почему у меня должна быть эта линия? Вы могли бы подумать, что самой функции будет достаточно, иначе я бы просто реализовал случайный размер в методе containerViewWillLayoutSubviews.

Ответ 1

frameOfPresentedViewInContainerView используется UIKit для получения исходного кадра представленного представления, который затем передается аниматору (соответствующий протоколу UIViewControllerAnimatedTransitioning), чтобы он знал целевую позицию представленного представления при настройке анимации. После того, как презентация анимации закончится, и презентация вверх по экрану, или один из контроллеров родительского представления может по-прежнему изменять размер из-за поворота или изменения класса размера. Экземпляр UIPresentationController имеет возможность ответить на эти изменения в методе containerViewWillLayoutSubviews и соответствующим образом изменить размер представленного представления.

Другими словами, контроллер представления всегда отвечает за определение макета для представленного представления, но изначально он просто сообщает UIKit, каков кадр, чтобы аниматор мог использовать эту информацию, но после этого контроллер представления устанавливает кадр на представленный вид напрямую.

Ответ 2

Вам нужно только иметь эту строку, если вы хотите, чтобы представленный кадр представления обновлялся при повороте экрана.