为什么使用frameOfPresentedViewInContainerView定义视图控制器的大小,它并不能达到预期的效果?

12

我一直在跟随这个教程,学习如何使用UIPresentationController在iOS 8中实现自定义视图控制器转换。到目前为止,一切都很清晰,但我似乎无法使我的视图控制器达到正确的大小。

在那个教程中,他们有以下代码:

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,我都懂。它返回一个尺寸,但是,如果我在 containerViewWillLayoutSubviews 中删除 presentedView().frame = frameOfPresentedViewInContainerView(),它就不起作用。为什么我必须有那一行?你会认为函数本身足够了,否则我会在 containerViewWillLayoutSubviews 方法中实现一个随机尺寸。

2个回答

10
frameOfPresentedViewInContainerView是UIKit用于获取初始presentedView的frame的,然后将其传递给遵守UIViewControllerAnimatedTransitioning协议的动画器,以便在设置动画时知道presented view的目标位置。在呈现动画完成并且屏幕或一个父视图控制器由于旋转或大小类别更改而调整大小后,UIPresentationController实例有机会在containerViewWillLayoutSubviews方法中响应这些更改,并相应地调整presentedView的大小。
换句话说,呈现控制器始终负责确定呈现视图的布局,但最初它只告诉UIKit frame是什么,以便动画器可以使用此信息,但在此之后,呈现控制器直接在presentedView上设置frame。

谢谢。我想知道UIPresentationController和UIViewControllerAnimatedTransitioning协议之间的区别是什么。 - Mark

0

如果您希望在屏幕旋转时更新呈现的视图框架,则只需要添加这行代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接