Jonathan Thurft Jonathan Thurft - 6 months ago 23
iOS Question

How to center a subview

I am adding a UIViewController subView to another UIViewController.

It works great. But I am having a hard time trying to center the subview in the middle of the parent view.

I read up and I found 2 lines of code that worked for other people but its not working for me.

Could anyone point out my problem??

those are:

popupController.view.center = [self.view convertPoint:self.view.center fromView:self.view.superview];


and

popupController.view.center = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2);


Parent View Controller code:

- (IBAction)selectRoutine:(id)sender {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];

createRoutinePopupViewController* popupController = [storyboard instantiateViewControllerWithIdentifier:@"createRoutinePopupView"];
// popupController.view.center = [self.view convertPoint:self.view.center fromView:self.view.superview];
popupController.view.center = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2);

//Tell the operating system the CreateRoutine view controller
//is becoming a child:
[self addChildViewController:popupController];

//add the target frame to self's view:
[self.view addSubview:popupController.view];

//Tell the operating system the view controller has moved:
[popupController didMoveToParentViewController:self];


}


enter image description here

child settings
enter image description here
enter image description here

Answer

Seems like you reposition your view controllers view after centering it. Probably in didMoveToParentViewController:.

Move the centering code to the end of selectRoutine: method

- (IBAction)selectRoutine:(id)sender
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];

    createRoutinePopupViewController* popupController = [storyboard instantiateViewControllerWithIdentifier:@"createRoutinePopupView"];

    [self addChildViewController:popupController];
    [self.view addSubview:popupController.view];
    [popupController didMoveToParentViewController:self];

    //do the centering here
    popupController.view.center = [self.view convertPoint:self.view.center fromView:self.view.superview];

}

Or better yet, move it to the didMoveToParentViewController:

- (void)didMoveToParentViewController:(UIViewController *)parent
{
    //whatever code you have here

    self.view.center = self.view.superview.center;
}

Possibly you will have to modify this code a bit. But i'm certain that your problem is incorrect (execution-time-wise) placement of the centering code - that gets subsequently overriden by some other view-positioning.