Почему определение размера моего контроллера представления с помощью frameOfPresentedViewInContainerView не делает его таким размером?
Я следовал этому руководству по реализации пользовательских переходов контроллера представления в 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 ответа
frameOfPresentedViewInContainerView
используется UIKit для получения начального кадра представленного представления, который затем передается аниматору (соответствует протоколу UIViewControllerAnimatedTransitioning), чтобы он знал целевую позицию представляемого представления при настройке анимации. После того, как представление анимации заканчивается и презентация запускается, экран или один из родительских контроллеров представления могут все еще изменять размер из-за поворота или изменения класса размера. Экземпляр UIPresentationController имеет шанс ответить на эти изменения в containerViewWillLayoutSubviews
метод и измените размер представленного представления соответствующим образом.
Другими словами, контроллер представления всегда отвечает за определение макета для представленного представления, но первоначально он просто сообщает UIKit, что такое кадр, чтобы аниматор мог использовать эту информацию, но после этого контроллер представления непосредственно устанавливает кадр в представляемом представлении.,
Эта строка нужна вам только в том случае, если вы хотите, чтобы отображаемый кадр обновлялся при повороте экрана.