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