diff --git a/AsyncDisplayKit/ASViewController.mm b/AsyncDisplayKit/ASViewController.mm index bc0275873a..fd9b67c9e0 100644 --- a/AsyncDisplayKit/ASViewController.mm +++ b/AsyncDisplayKit/ASViewController.mm @@ -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)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)coordinator -{ - [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; - - ASEnvironmentTraitCollection environmentTraitCollection = [self environmentTraitCollectionForWindowSize:size]; - [self progagateNewEnvironmentTraitCollection:environmentTraitCollection]; -} - - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];