12

我一直在关注本教程,了解如何在 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方法中实现一个随机大小。

4

2 回答 2

9

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

换句话说,呈现控制器总是负责确定呈现视图的布局,但最初它只是告诉 UIKit 框架是什么,以便动画师可以使用这些信息,但之后呈现控制器直接在呈现视图上设置框架.

于 2016-07-13T01:20:07.710 回答
0

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

于 2016-02-28T23:19:47.837 回答