Reputation: 129
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?
Upvotes: 3
Views: 8592
Reputation: 8011
As @Rob Napier answered,
There is no such thing as -[UIViewController layoutSubviews] or -[UIViewController setNeedsLayout]. These are UIView methods.
This is nice, So we are about to subclassing the UIView
& assign it as the custom class of the UIViewController
's view
property. It will work as well, but very lengthy & too much to do for each UIViewController
.
There is a easier way (obvious way what we should follow) using the viewWillLayoutSubviews
& viewDidLayoutSubviews
provided in the UIViewController
class.
As the name suggested they are called just before & after, doing the layout thing in the UIView
.
Hope these might help Happy coding
Upvotes: 1
Reputation: 934
You can have your layout related codes in - (void)viewWillLayoutSubviews method and call [self.viewControllerObject.view setNeedsLayout] where ever you need to layout your subviews of viewControllerObject.
Upvotes: 1
Reputation: 299345
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
.
Upvotes: 6
Reputation: 11834
You should never call -layoutSubviews
directly. It might be detrimental to performance, but other reasons might as well apply. Instead call -setNeedsLayout
. This method sets a flag (or Boolean) that on some next drawing pass the -layoutSubviews
method should be called (several methods might set this flag, but it won't force a redraw until the time is right).
Does your -layoutSubviews
implementation call -layoutSubviews
on the super class?
Perhaps you should show some code so we might help you further with this issue.
Upvotes: 1