Apple изменила, как презентация работает в iOS8, они используют презентационные контроллеры, потому что презентационные контроллеры не являются KVO-совместимыми, мне пришлось использовать containerView
, потому что это removedFromSuperview
и обнуляется при вызове -[UIPresentationController transitionDidFinish:]
. Решение для iOS8 и выше:
self.presentationContext.presentViewController(self.viewControllerToPresent, animated: true, completion: { _ in
self.viewControllerToPresent.presentationController?.addObserver(self, forKeyPath: "containerView", options: [], context: &self.observingContext)
})
Я добавляю, что наблюдатель - завершение, потому что иногда презентация может завершиться неудачей, особенно при представлении уже представленного viewController.
В значении наблюдателя я должен удалить наблюдение, когда containerView больше не существует:
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
guard &self.observingContext == context else {
super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
return
}
if let presentationController = object as? UIPresentationController where presentationController.containerView == nil {
presentationController.removeObserver(self, forKeyPath: "containerView")
}
}