0

When i press a button on my view controller, i would like to present another controller on top of it, but in the middle and not in full screen.

How could i present a controller on top of another controller in such way?

Erik Sapir
  • 23,209
  • 28
  • 81
  • 141

4 Answers4

2

If you are trying it on iPad you can always set up a Popover that contains your new view.

UIYourNewViewController *vc = [[UIYourNewViewController alloc] init];

UIPopoverController *popVc = [[UIPopoverController alloc] initWithContentViewController:vc];
[popVc setPopoverContentSize:*the size that you want or your resized vc*];
[popVc presentPopoverFromRect:*position of the screen you want to show the popover* inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

With this you will create a Popover of the size of the view of your viewcontroller and you can pop it up in the position that you want. To make sure it works on iPhone also, you should create a category for the UIPopoverController and add this method in the .m

+ (BOOL)_popoversDisabled {
return NO;

}

Remember to declare the method in the .h of the category.

iOSAddicted
  • 389
  • 1
  • 17
  • This solution doesn't work anymore in iOS8. In this case it will open a ModalViewController of the size of your screen. – iOSAddicted Nov 17 '14 at 19:26
1

You need to set this property to your controller before presenting it.

controller.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentViewController:controller animated:YES completion:nil];
Apurv
  • 17,116
  • 8
  • 51
  • 67
0

Yes it is possible you have to present view controllers view with animation. Please refer the below code. You will get some idea its showing animation from bottom of screen to middle of screen.

YourViewController *viewController = [[YourViewController alloc] init];
    [viewController.view setFrame:CGRectMake(0, -(CGRectGetHeight(viewController.view.frame)), CGRectGetWidth(viewController.view.frame), CGRectGetHeight(self.view.frame))];

    [self.view addSubview:viewController.view];
    [UIView animateWithDuration:0.8 animations:^{

        [viewController.view setFrame:CGRectMake(0, 0, CGRectGetWidth(viewController.view.frame), CGRectGetHeight(viewController.view.frame))];

    } completion:^(BOOL finished) {
        [self.navigationController pushViewController:viewController animated:NO];
    }];
Ashwinkumar Mangrulkar
  • 2,956
  • 3
  • 15
  • 17
0

In iPhone, presenting a UIViewController is always fullscreen. On iPad, you can use a UISplitViewController or build a custom container, but the view controllers you present will fill the containers in both a UISplitViewController and custom container controller.

To present content on only part of the screen, you can animate a UIView onto your view controller. There are ways to present a view controller and still have another view controller show up behind it, but this is not recommended.

Check out this other question for more information on creating a custom container view controller..

Community
  • 1
  • 1
Jeff Wolski
  • 6,332
  • 6
  • 37
  • 69