why isn't -layoutSubviews being called?

alsuhr picture alsuhr · Aug 13, 2012 · Viewed 8.3k times · Source

I'm trying to create a custom layout for some subviews. My file is a ViewController, so I have to refer to its view as self.view. The subviews are subviews of self.view.

When I call [self layoutSubviews]; explicitly in viewDidLoad, it will execute the code in -layoutSubviews without a problem.

However, I've read that I shouldn't call -layoutSubviews explicitly, or call it on self since that's a UIViewController. I tried implementing -setNeedsLayout by calling it like this: [self.view setNeedsLayout] in viewDidLoad, and taking out the explicit call of -layoutSubviews but keeping its declaration. But that didn't seem to work.

I was linked to an article about when layoutSubviews is called and it seems like it should be called when I add subviews, but that doesn't seem to be happening here.

If I want to be safe, and do things the way it suggests in the class reference for UIView and its methods, how should I go about being able to use both methods?

Answer

Rob Napier picture Rob Napier · Aug 13, 2012

There is no such thing as -[UIViewController layoutSubviews] or -[UIViewController setNeedsLayout]. These are UIView methods.

If you want to use the layoutSubviews system, you need to subclass your top-level UIView and implement it there. By default, it does nothing. If you want to layout your views using the view controller, then I would name the methods something else (like layout, since a view controller doesn't have "subviews") to avoid confusion with UIView.