为什么不用frameOfPresentedViewInContainerView定义我的视图控制器大小使它成为那么大?

时间:2015-04-02 22:03:14

标签: ios uiviewcontroller ios8 uikit uipresentationcontroller

我一直关注this tutorial在iOS 8中使用UIPresentationController实现自定义视图控制器转换,到目前为止一切都有意义,但我似乎无法让我的视图控制器成为大小合适。

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

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方法中实现随机大小。

2 个答案:

答案 0 :(得分:4)

UIKit使用frameOfPresentedViewInContainerView来获取初始的presentView框架,然后将其传递给动画师(符合UIViewControllerAnimatedTransitioning协议),以便在设置时知道所呈现视图的目标位置动画。在呈现动画结束并且呈现结束之后,屏幕或父视图控制器之一可能仍然由于旋转或尺寸类别改变而调整大小。 UIPresentationController实例有机会在containerViewWillLayoutSubviews方法中响应这些更改并适当调整presentView的大小。

换句话说,演示控制器总是负责确定所呈现视图的布局,但最初它只是告诉UIKit帧是什么,以便动画师可以使用此信息但在此之后,演示控制器设置框架直接提出了观点。

答案 1 :(得分:0)

如果您希望在屏幕旋转时更新显示的视图框,则只需要该行。