iOS 8+ универсальный метод для полного экрана без неправильного контекста анимации. В Objective-C и Swift
Objective-C
- (void)dismissModalStackAnimated:(bool)animated completion:(void (^)(void))completion {
UIView *fullscreenSnapshot = [[UIApplication sharedApplication].delegate.window snapshotViewAfterScreenUpdates:false];
[self.presentedViewController.view insertSubview:fullscreenSnapshot atIndex:NSIntegerMax];
[self dismissViewControllerAnimated:animated completion:completion];
}
Swift
func dismissModalStack(animated: Bool, completion: (() -> Void)?) {
if let fullscreenSnapshot = UIApplication.shared.delegate?.window??.snapshotView(afterScreenUpdates: false) {
presentedViewController?.view.addSubview(fullscreenSnapshot)
}
if !isBeingDismissed {
dismiss(animated: animated, completion: completion)
}
}
ТЛ; др
Что не так с другими решениями?
Существует много решений, но ни одно из них не считается неправильным контекстом отклонения, поэтому:
например. root A -> Presents B -> Presents C , и вы хотите отстранить A от C, вы можете официально позвонить по номеру dismissViewControllerAnimated
на rootViewController
.
[[UIApplication sharedApplication].delegate.window.rootViewController dismissModalStackAnimated:true completion:nil];
Однако отклонение вызова для этого корня из C приведет к правильному поведению с неправильным переходом (B к A было бы замечено вместо C к A).
так
Я создал универсальный метод отклонения. Этот метод возьмет текущий полноэкранный снимок и поместит его над представленным контроллером представления получателя, а затем отклонит все это. (Пример: вызывается отклонение по умолчанию от C, но B действительно считается отклонением)