iOS AutoLayout - get frame size width

69,316

Solution 1

I think auto layout hasn't had the time to layout your views by the time you call this. Auto layout hasn't happened by the time viewDidLoad is called, because it's called just after the views are loaded and it's only after that that the views are placed into the view controller's view hierarchy and eventually laid out (in the view's layoutSubviews method).

Edit: this answer points out why the scenario in the question doesn't work. @dreamzor's answer points out where to place your code in order to solve it.

Solution 2

Actually, above answers are not quite right. I followed them and got zeros again and again.

The trick is to place your frame-dependent code to the viewDidLayoutSubviews method, which

Notifies the view controller that its view just laid out its subviews.

Do not forget that this method is called multiple times and is not the part of ViewController's life cycle, so be careful while using this.

Hope it will be helpful to someone.

Just wanted to add, that for my program without landscape mode NOT using Auto Layout is way much simplier... I tried, though =D

Solution 3

Include in your viewDidLoad()

self.view.setNeedsLayout()
self.view.layoutIfNeeded()

Before accessing yourview.frame.size.width

Solution 4

Solution

  • Place that code in viewDidAppear

Reason

  • viewDidLoad happens before autolayout is completed. So the position is not yet set by autolayout that was specified in xib
  • viewDidAppear happens after autolayout is completed.

Solution 5

Actually I managed to force the layout update before my code within the viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()

        println("bounds before \(self.previewContainer.bounds)");
        //on iPhone 6 plus -> prints bounds before (0.0,0.0,320.0,320.0)

        self.view.setNeedsLayout()
        self.view.layoutIfNeeded()

        println("bounds after \(self.previewContainer.bounds)");
        //on iPhone 6 plus -> prints bounds after (0.0,0.0,414.0,414.0)

        //Size dependent code works here
        self.create()
    }

UPDATE: This doesn't seem to work anymore

Share:
69,316
user1046037
Author by

user1046037

Updated on November 10, 2020

Comments

  • user1046037
    user1046037 over 3 years

    I am developing using iOS 6 auto layout

    I would like to log a message displaying the frame width of the view.

    I can see the textView on the screen.

    But I get the width and height as zero, am I missing something ?

    NSLog(@"textView    = %p", self.textView);
    NSLog(@"height      = %f", self.textView.frame.size.height);
    NSLog(@"width       = %f", self.textView.frame.size.width);
    
    textView    = 0x882de00
    height      = 0.000000
    width       = 0.000000