Display UIViewController as Popup in iPhone
NOTE : This solution is broken in iOS 8. I will post new solution ASAP.
I am going to answer here using storyboard but it is also possible without storyboard.
Init: Create two
UIViewController
in storyboard.- lets say
FirstViewController
which is normal andSecondViewController
which will be the popup.
- lets say
Modal Segue: Put
UIButton
in FirstViewController and create a segue on thisUIButton
toSecondViewController
as modal segue.Make Transparent: Now select
UIView
(UIView
Which is created by default withUIViewController
) ofSecondViewController
and change its background color to clear color.Make background Dim: Add an
UIImageView
inSecondViewController
which covers whole screen and sets its image to some dimmed semi transparent image. You can get a sample from here :UIAlertView
Background ImageDisplay Design: Now add an
UIView
and make any kind of design you want to show. Here is a screenshot of my storyboard- Here I have add segue on login button which open
SecondViewController
as popup to ask username and password
- Here I have add segue on login button which open
Important: Now that main step. We want that
SecondViewController
doesn't hide FirstViewController completely. We have set clear color but this is not enough. By default it adds black behind model presentation so we have to add one line of code in viewDidLoad ofFirstViewController
. You can add it at another place also but it should run before segue.[self setModalPresentationStyle:UIModalPresentationCurrentContext];
Dismiss: When to dismiss depends on your use case. This is a modal presentation so to dismiss we do what we do for modal presentation:
[self dismissViewControllerAnimated:YES completion:Nil];
Thats all.....
Any kind of suggestion and comment are welcome.
Demo :You can get demo source project from Here : Popup Demo
NEW : Someone have done very nice job on this concept : MZFormSheetController
New : I found one more code to get this kind of function : KLCPopup
iOS 8 Update : I made this method to work with both iOS 7 and iOS 8
+ (void)setPresentationStyleForSelfController:(UIViewController *)selfController presentingController:(UIViewController *)presentingController{ if (iOSVersion >= 8.0) { presentingController.providesPresentationContextTransitionStyle = YES; presentingController.definesPresentationContext = YES; [presentingController setModalPresentationStyle:UIModalPresentationOverCurrentContext]; } else { [selfController setModalPresentationStyle:UIModalPresentationCurrentContext]; [selfController.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext]; }}
Can use this method inside prepareForSegue deligate like this
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { PopUpViewController *popup = segue.destinationViewController; [self setPresentationStyleForSelfController:self presentingController:popup]}
Modal Popups in Interface Builder (Storyboards)
Step 1
On the ViewController you want as your modal popup, make the background color of the root UIView clear.Tip: Do not use the root UIView as your popup. Add a new UIView that is smaller to be your popup.
Step 2
Create a Segue to the ViewController that has your popup. Select "Present Modally".
Two Methods To Create Popup From Here
Method One - Using the Segue
Select the Segue and change Presentation to "Over Current Context":
Method Two - Using the View Controller
Select the ViewController Scene that is your popup. In Attributes Inspector, under View Controller section, set Presentation to "Over Current Context":
Either method will work. That should do it!
You can do this in Interface Builder.
- For the view you wish to present modally set its outermost view background to transparent
- Control + click and drag from the host view controller to the modal view controller
- Select present modally
- Click on the newly created segue and in the Attribute Inspector (on the right) set "Presentation" to "Over Current Context"