Stworzyłem obiekt do obsługi prezentacji tego, co nazywam „nałożonym modalem”, co oznacza, że zachowuje widok tła i pozwala mieć modal z przezroczystym tłem.
Ma jedną, prostą metodę, która robi to:
- (void)presentViewController:(UIViewController *)presentedViewController
fromViewController:(UIViewController *)presentingViewController
{
presentedViewController.modalPresentationStyle = UIModalPresentationCustom;
presentedViewController.transitioningDelegate = self;
presentedViewController.modalPresentationCapturesStatusBarAppearance = YES;
[presentedViewController setNeedsStatusBarAppearanceUpdate];
[presentingViewController presentViewController:presentedViewController
animated:YES
completion:nil];
}
Ważne jest, aby ustawić modalPresentationCapturesStatusBarAppearance
właściwość YES
i wymusić aktualizację wyglądu paska stanu, jeśli prezentowany kontroler widoku ma innypreferredStatusBarStyle
.
Ten obiekt powinien mieć @property (assign, nonatommic) isPresenting
Chcesz ten przedmiot do wykonania do UIViewControllerAnimatedTransitioning
i UIViewControllerTransitioningDelegate
protokołów i wdrożyć następujące metody:
- (id)animationControllerForPresentedController:(UIViewController *)presented
presentingController:(UIViewController *)presenting
sourceController:(UIViewController *)source
{
self.isPresenting = YES;
return self;
}
- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
self.isPresenting = NO;
return self;
}
i:
- (NSTimeInterval)transitionDuration:(id)transitionContext
{
return 0.25;
}
- (void)animateTransition:(id)transitionContext
{
UIViewController* firstVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController* secondVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView* containerView = [transitionContext containerView];
UIView* firstView = firstVC.view;
UIView* secondView = secondVC.view;
if (self.isPresenting) {
[containerView addSubview:secondView];
secondView.frame = (CGRect){
containerView.frame.origin.x,
containerView.frame.origin.y + containerView.frame.size.height,
containerView.frame.size
};
firstView.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
[UIView animateWithDuration:0.25 animations:^{
secondView.frame = containerView.frame;
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
} else {
[UIView animateWithDuration:0.25 animations:^{
firstView.frame = (CGRect){
containerView.frame.origin.x,
containerView.frame.origin.y + containerView.frame.size.height,
containerView.frame.size
};
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
}
}
Robi to animację wsuwania z dołu naśladującą domyślną animację modalną, ale możesz zrobić to, co chcesz.
Ważne jest to, że widok kontrolera widoku prezentującego pozostanie z tyłu, umożliwiając stworzenie przezroczystego efektu.
To rozwiązanie działa na iOS 7+