Ich habe ein Objekt erstellt, das die Darstellung eines so genannten "überlagerten Modals" übernimmt. Dies bedeutet, dass die Ansicht des Hintergrunds beibehalten wird und Sie ein Modal mit transparentem Hintergrund erstellen können.
Es gibt eine einzige einfache Methode, die dies tut:
- (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];
}
Es ist wichtig, die modalPresentationCapturesStatusBarAppearance
Eigenschaft auf YES
festzulegen und die Aktualisierung der Statusleiste zu erzwingen, wenn Ihr dargestellter Ansichts-Controller einen anderen hat preferredStatusBarStyle
.
Dieses Objekt sollte eine haben @property (assign, nonatommic) isPresenting
Sie wollen diese Aufgabe auf die erfüllen UIViewControllerAnimatedTransitioning
und UIViewControllerTransitioningDelegate
Protokolle und die folgenden Methoden implementieren:
- (id)animationControllerForPresentedController:(UIViewController *)presented
presentingController:(UIViewController *)presenting
sourceController:(UIViewController *)source
{
self.isPresenting = YES;
return self;
}
- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
self.isPresenting = NO;
return self;
}
und:
- (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];
}];
}
}
Dadurch wird eine Animation von unten nach unten ausgeführt, die die standardmäßige modale Animation nachahmt. Sie können sie jedoch beliebig gestalten.
Wichtig ist, dass die Ansicht des präsentierenden View Controllers im Hintergrund bleibt und Sie einen transparenten Effekt erzielen.
Diese Lösung funktioniert für iOS 7+