Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to present a semi-transparent (half-cut) viewcontroller in iOS 8

in iOS 7 there is no problem for this method:

_rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
[_rootViewController presentViewController:self animated:NO completion:nil];

But in iOS 8 it did nothing.How to solve it? Is it a Bug for iOS 8?

like image 670
SuperHappy Avatar asked Jun 11 '14 09:06

SuperHappy


2 Answers

My answer is more simple, below code. This works in iOS8 (XCode6 GM seed).

HogeViewController *vc = [[HogeViewController alloc] init];
vc.modalPresentationStyle = UIModalPresentationOverFullScreen;
[self presentViewController:vc animated:NO completion:nil];
like image 130
ushisantoasobu Avatar answered Oct 22 '22 14:10

ushisantoasobu


Note this workaround was needed on xcode6_beta7. The lastest xcode6 has the UIModalPresentationOver* styles fixed. So, I'm just assigning them to myModalViewController.modalPresentationStyle and now it works ok.

Finally made it work in iOS 8 after reading the UIPresentationController help and this post

appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
MyModalController *myModalController = [[MyModalController alloc] initWithNibName:@"MyModalController" bundle:nil];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myModalController];
navController.modalPresentationStyle = UIModalPresentationCustom;
navController.transitioningDelegate = myModalController;

[self.navigationController presentViewController:navController animated:YES completion:nil];

You can make the modal view controller inherit from UIViewControllerTransitioningDelegate

@interface MyModalController : UIViewController <UIViewControllerTransitioningDelegate>

and override presentationControllerForPresentedViewController:...

-(UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)presented presentingViewController:(UIViewController *)presenting sourceViewController:(UIViewController *)source
{
    if (presented == self) {
        return [[TransparentPresentationController alloc] initWithPresentedViewController:presented presentingViewController:presenting];
    } else {
        return nil;
    }
}

returning an instance of TransparentPresentationController which inherits from UIPresentationController

@interface TransparentPresentationController : UIPresentationController

and overrides shouldRemovePresentersView

- (BOOL) shouldRemovePresentersView {
    return NO;
}
like image 3
Zuzel Vera Avatar answered Oct 22 '22 14:10

Zuzel Vera