Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ios 8 change the size of presented/modal view controller

In ios 7 and before, I was updating the bounds of presentedViewController.view.superview to custom the size of presented view controller, but it seems this would not be the case in ios 8 any more. Since there is no superview can be set on the view controller(return nil when you try to call it in debugger).

Any suggestions how to update the presented view controller's size? This would be used for the custom presentation transition.

like image 436
Xing Avatar asked Sep 12 '14 14:09

Xing


3 Answers

In case anyone runs into this later, here is how I solve it.

Subclass the UIPresentationController and return the frame in frameOfPresentedViewInContainerView. Feed this into the transitioningDelegate that you create for the presentedViewController.

Or, you may set the final frame for the presentedView in the animateTransition:, which belongs to the animator object you created for transitioningDelegate. However, this is the old iOS 7 way of doing it. Since Apple introduce UIPresentationController, any size/frame changes should be done there instead, which is the previous method I mentioned.

Here are some extra information that may not be directly related to solving the problem.

For those of you who never got your hands on the apple view controller transition api, just like me before, here are the steps.

  1. Create YourTransitioningDelegate, which conforms UIViewControllerTransitioningDelegate. In here, generally three things need to be set, PresentationController, PresentedAnimationController, DismissedAnimationController.

  2. Create YourTransitionAnimator, which conforms UIViewControllerAnimatedTransitioning. Here, two functions need to be override, transitionDuration and animateTransition(This is where all the animation happens, adding/removing and animating the presentedView. Make you call completeTransition on transitionContext to end the animation).

  3. Subclass UIPresentationController. Depends on each individual needs, you may do a ton of things here. I just added a dimmingView and changed the frame of presentedViewController.

  4. Finally, hook things up before presenting the view controller, which is changing the modalPresentationStyle to be custom and setting the transitioning delegate.

Things I found really helpful, two 2014 WWDC videos("View controllers advancements" and "A look inside presentation controllers") and the sample project from Apple(LookInside-photoEditingApp).

like image 90
Xing Avatar answered Nov 10 '22 08:11

Xing


I guess the following is easier and it works in iOS 8:

self.myViewController.modalPresentationStyle = UIModalPresentationFormSheet;
self.myViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

//This will be the size you want
self.myViewController.preferredContentSize = CGSizeMake(822, 549);

[self presentViewController:self.myViewController animated:YES completion:nil];
like image 33
Ali Avatar answered Nov 10 '22 07:11

Ali


Instead of subclassing you can use the preferredContentSize property

- (void)viewDidLoad {
   [super viewDidLoad];

   self.preferredContentSize = CGSizeMake((self.view.frame.size.width / 100) * 65, (self.view.frame.size.height / 100) * 65);
}
like image 1
Jean Rapahel Avatar answered Nov 10 '22 07:11

Jean Rapahel