Я створив об’єкт для обробки подання того, що я називаю "накладеним модальним", тобто він зберігає подання фону і дозволяє мати модальний режим з прозорим фоном.
Він має єдиний простий метод, який робить це:
- (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];
}
Важливо встановити modalPresentationCapturesStatusBarAppearance
властивість YES
і змусити оновити зовнішній вигляд рядка стану, якщо представлений контролер перегляду має інше preferredStatusBarStyle
.
Цей об'єкт повинен мати @property (assign, nonatommic) isPresenting
Ви хочете , щоб цей об'єкт відповідає Критеріям UIViewControllerAnimatedTransitioning
та UIViewControllerTransitioningDelegate
протоколів і реалізувати такі методи:
- (id)animationControllerForPresentedController:(UIViewController *)presented
presentingController:(UIViewController *)presenting
sourceController:(UIViewController *)source
{
self.isPresenting = YES;
return self;
}
- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
self.isPresenting = NO;
return self;
}
і:
- (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];
}];
}
}
Це робить анімацію ковзання знизу вниз, що імітує модальну анімацію за замовчуванням, але ви можете зробити її все, що завгодно.
Важливим є те, що подання контролера подання подання буде залишатися ззаду, дозволяючи створити прозорий ефект.
Це рішення працює для iOS 7+