UIView height is not right on iPhone 5

random picture random · Sep 21, 2012 · Viewed 14.2k times · Source

I am migrating my apps over and on one I use a UIPickerView. In the viewDidLoad method I create the picker and set it's y origin to be self.view.frame.size.height so that it is off screen. Then I just move it up when needed.

On the iPhone 5 self.view.frame.size.height is still returning 480 yet the UIView fills the screen correctly.

I've even tried using CGRectGetHeight(self.view.bounds) thinking that it may return something different...no dice. Any ideas as to why this maybe occurring.

Answer

htafoya picture htafoya · Jan 14, 2013

That is because the size you selected in the view's nib will be used until viewWillAppear: (BOOL) animated method. Then it will take the correct size.

However you can use the following code to have the correct size since viewDidLoad is called:

CGSize viewSize = [[UIScreen mainScreen] bounds].size;
viewSize = CGSizeMake(viewSize.width, viewSize.height - STATUS_BAR_HEIGHT);

STATUS_BAR_HEIGHT is 20 but it depends on your app. You may or may not need to add that line.

EDIT

The problem with using mainScreen bounds is that the frame doesn't change on orientation change. That is the way it is designed. You can work it out with the following:

    CGSize viewSize = [[UIScreen mainScreen] bounds].size;

    if(UIInterfaceOrientationIsLandscape(CURRENT_ORIENTATION)){
        viewSize = CGSizeMake(viewSize.height, viewSize.width - STATUS_BAR_HEIGHT);

    } else {
        viewSize = CGSizeMake(viewSize.width, viewSize.height - STATUS_BAR_HEIGHT);
    }

CURRENT_ORIENTATION is [[UIApplication sharedApplication] statusBarOrientation];