Saya telah membuat objek untuk menangani presentasi dari apa yang saya sebut "modal superposed", yang berarti ia mempertahankan tampilan latar belakang dan memungkinkan Anda untuk memiliki modal dengan latar belakang transparan.
Ini memiliki satu, metode sederhana yang melakukan ini:
- (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];
}
Sangat penting untuk menyetel modalPresentationCapturesStatusBarAppearance
properti ke YES
dan memaksa tampilan bilah status untuk memperbarui, jika pengontrol tampilan yang disajikan Anda memiliki yang berbeda preferredStatusBarStyle
.
Objek ini harus memiliki @property (assign, nonatommic) isPresenting
Anda ingin objek ini untuk memenuhi ke UIViewControllerAnimatedTransitioning
dan UIViewControllerTransitioningDelegate
protokol dan menerapkan metode berikut:
- (id)animationControllerForPresentedController:(UIViewController *)presented
presentingController:(UIViewController *)presenting
sourceController:(UIViewController *)source
{
self.isPresenting = YES;
return self;
}
- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
self.isPresenting = NO;
return self;
}
dan:
- (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];
}];
}
}
Ini melakukan animasi slide-in-from-the-bottom meniru modal animasi default, tetapi Anda dapat membuatnya apa pun yang Anda inginkan.
Yang penting adalah bahwa pandangan pengendali tampilan presentasi akan tetap di belakang, membiarkan Anda membuat efek transparan.
Solusi ini berfungsi untuk iOS 7+