From 180fcbbc5eb25fa38c9c68a03f1f205345bfaaf7 Mon Sep 17 00:00:00 2001 From: ricky Date: Tue, 6 Sep 2016 15:23:32 -0700 Subject: [PATCH] [ASViewController] stop propagating traits in the `viewWill...` methods (#2202) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [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 --- AsyncDisplayKit/ASViewController.mm | 46 ++++++++--------------------- 1 file changed, 13 insertions(+), 33 deletions(-) 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];