Getting subViews' frames in Storyboard

ios, uistoryboard, xcode

Solution

Those dimensions are calculated and set when the call to `layoutSubviews` is made, which occurs after `viewWillAppear`. After `layoutSubviews` is called on the UIVIew you can get the dimensions.

Look at implementing this method in your view controller: `viewDidLayoutSubviews`. At this point you should be able to get dimensions of your subviews. Note that this call is available starting in iOS 5.0 but since you reference storyboards I assume you are working at or above that anyway.

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    NSLog(@"View Controller did layout subviews. firstViewFirstSubView: %@ ", firstViewFirstSubView);
    NSLog(@"subView's dimmensions: %f by %f at %f, %f", firstViewFirstSubView.frame.size.width,
      firstViewFirstSubView.frame.size.height,
      firstViewFirstSubView.frame.origin.x,
      firstViewFirstSubView.frame.origin.y);
}

Problem

I just want (for now) to get the dimensions of a subview on the view controller's instantiation. [This is a reduction to as simple a case I can find of a previous question. I am trying to figure out why subViews of scenes in Storyboards are not behaving the way I expect, which is to say: like XIBs do - I just want to get dimensions of my subviews before anything is actually drawn to the screen] To condense the problem down to a new, clean project, I do this: - create a new, single view project with "using Storyboard" checked - add a single UIView to the default existing `MainStoryboard_iPad.storyboard` (and change its background to green to make it more easily seen - beyond shrinking the dimensions some, this is the only change I make from the default UIView I drag onto the scene) - option-click the `ViewController.h` file in the navigator to bring it up in its own frame underneath the Storyboard frame and insert a pair of braces underneath the `@interface` directive - control-click-and-drag from the UIView in the Storyboard to `ViewController.h` and tell it to name the outlet `firstViewFirstSubView` So we now have for `ViewController.h`: ``` #import <UIKit/UIKit.h> @interface ViewController : UIViewController { IBOutlet UIView *firstViewFirstSubView; } @end ``` Then, I add this method to the ViewController.m: ``` - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSLog(@"View Controller will appear. firstViewFirstSubView: %@ ", firstViewFirstSubView); NSLog(@"subView's dimmensions: %f by %f at %f, %f", firstViewFirstSubView.frame.size.width, firstViewFirstSubView.frame.size.height, firstViewFirstSubView.frame.origin.x, firstViewFirstSubView.frame.origin.y); } ``` At this point, I expect to be able to get the dimensions of the UIView subview. I get all 0s, though: ``` 2012-11-15 15:21:00.743 StoryboardViewBounds[11132:c07] View Controller will appear. firstViewFirstSubView: <UIView: 0x9379730; frame = (0 0; 0 0); autoresize = TM+BM; layer = <CALayer: 0x9378e40>> 2012-11-15 15:21:00.744 StoryboardViewBounds[11132:c07] subView's dimmensions: 0.000000 by 0.000000 at 0.000000, 0.000000 ``` What am I doing wrong? It seems like this should be very straightforward, so I think I must be missing something simple, whether throwing the right switch in the Storyboard editor or implementing a method that Storyboard needs.

Original source