Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS - viewDidLayoutSubviews called before auto-layout completed on iOS7

We're currently having a problem that only seems to affect iOS7 devices.

Within our .xib file we have two views within a container view (i.e.: not at the top level of the view hierarchy) that need to be circular on display. The views have constraints applied to their position and horizontal spacing within the container, and an aspect ratio condition requiring they are square. The views should expand in width/height on larger screen sizes, respecting the constraints described.

In our VC, we have the following in viewDidLayoutSubviews to force these views to appear circular:

- (void)viewDidLayoutSubviews {
    self.progressContentContainerView.layer.cornerRadius = self.progressContentContainerView.frame.size.width/2;
}

This seems to work fine on iOS8, however on iOS7 there is a period after the view has been displayed where the constraints have not yet been applied and the size of the view/views is incorrect (see attached screenshots). This resolves itself and correctly renders a circle after half a second. This only appears to happen when the views that we intend to be circular are NOT at the top level of the VC's view hierarchy which seems to imply that viewDidLayoutSubviews is called before the subviews of subviews have also been laid out.

Circle with incorrect cornerRadiusCircle properly rendered after half a second

My guess is that we could potentially fix this issue by subclassing UIView for the nested container, adding references to the circular view within this subclass and overriding viewDidLayoutSubviews here to make the cornerRadius adjustment. This seems like a bit of a workaround though and I'm interested to see if there are other options.

Is there a cleaner/more idiomatic solution to this problem?

like image 936
jmc Avatar asked Jan 29 '15 00:01

jmc


1 Answers

I know this is an old question but have you tried calling either:

[self.progressContentContainerView setNeedsUpdateConstraints];

or:

[self.progressContentContainerView layoutIfNeeded];
like image 97
SunburstEnzo Avatar answered Oct 31 '22 21:10

SunburstEnzo