[ASViewController] stop propagating traits in the viewWill... methods (#2202)

* [ASTraitCollection] Fix 2 bugs dealing with trait propagation

* Don’t propagate on `viewWillTransitionToTraitCollection`. This is too early
* Pass the size from `viewWillTransitionToSize` as the container size in `traitCollectionDidChange`

* using the old trait collection’s size doesn’t actually make sense.

* Instead of propagating on viewWillTransitionToSize, do it in viewWillLayoutSubviews
This commit is contained in:
ricky 2016-09-06 15:23:32 -07:00 committed by Adlai Holler
parent 2388f67474
commit 180fcbbc5e

View File

@ -94,7 +94,19 @@
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
[_node measureWithSizeRange:[self nodeConstrainedSize]];
// Before layout, make sure that our trait collection containerSize actually matches the size of our bounds.
// If not, we need to update the traits and propagate them.
if (CGSizeEqualToSize(self.node.environmentTraitCollection.containerSize, self.view.bounds.size) == NO) {
[UIView performWithoutAnimation:^{
ASEnvironmentTraitCollection environmentTraitCollection = [self environmentTraitCollectionForUITraitCollection:self.traitCollection];
environmentTraitCollection.containerSize = self.view.bounds.size;
// this method will call measure
[self progagateNewEnvironmentTraitCollection:environmentTraitCollection];
}];
} else {
[_node measureWithSizeRange:[self nodeConstrainedSize]];
}
if (!AS_AT_LEAST_IOS9) {
[self _legacyHandleViewDidLayoutSubviews];
@ -274,17 +286,6 @@ ASVisibilityDepthImplementation;
return asyncTraitCollection;
}
- (ASEnvironmentTraitCollection)environmentTraitCollectionForWindowSize:(CGSize)windowSize
{
if (self.overrideDisplayTraitsWithWindowSize) {
ASTraitCollection *traitCollection = self.overrideDisplayTraitsWithWindowSize(windowSize);
return [traitCollection environmentTraitCollection];
}
ASEnvironmentTraitCollection traitCollection = self.node.environmentTraitCollection;
traitCollection.containerSize = windowSize;
return traitCollection;
}
- (void)progagateNewEnvironmentTraitCollection:(ASEnvironmentTraitCollection)environmentTraitCollection
{
ASEnvironmentState environmentState = self.node.environmentState;
@ -315,27 +316,6 @@ ASVisibilityDepthImplementation;
[self progagateNewEnvironmentTraitCollection:environmentTraitCollection];
}
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator];
ASEnvironmentTraitCollection environmentTraitCollection = ASEnvironmentTraitCollectionFromUITraitCollection(newCollection);
// A call to willTransitionToTraitCollection:withTransitionCoordinator: is always followed by a call to viewWillTransitionToSize:withTransitionCoordinator:.
// However, it is not immediate and we may need the new trait collection before viewWillTransitionToSize:withTransitionCoordinator: is called. Our view already has the
// new bounds, so go ahead and set the containerSize and propagate the traits here. As long as nothing else in the traits changes (which it shouldn't)
// then we won't we will skip the propagation in viewWillTransitionToSize:withTransitionCoordinator:.
environmentTraitCollection.containerSize = self.view.bounds.size;
[self progagateNewEnvironmentTraitCollection:environmentTraitCollection];
}
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
ASEnvironmentTraitCollection environmentTraitCollection = [self environmentTraitCollectionForWindowSize:size];
[self progagateNewEnvironmentTraitCollection:environmentTraitCollection];
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[super didRotateFromInterfaceOrientation:fromInterfaceOrientation];