Я создал объект для обработки представления того, что я называю «наложенным модальным», то есть он сохраняет вид фона и позволяет вам получить модальный с прозрачным фоном.
У него есть один простой метод, который делает это:
- (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+