From 05ba3a256597a3de3090431cb00bbefc4e4e5dcf Mon Sep 17 00:00:00 2001 From: Dustin Shahidehpour Date: Fri, 14 Oct 2016 14:22:49 -0700 Subject: [PATCH] Do not measure the view if it is hidden. Summary: If views are hidden on screen, we don't want to bother including them in layout calculations. Reviewed By: rnystrom Differential Revision: D4022992 fbshipit-source-id: 2e93eb911f26223f305ef7ce788f86d050b83e4a --- uikit/CSSLayout/Tests/CSSLayoutTests.m | 17 +++++++++++++++-- uikit/CSSLayout/UIView+CSSLayout.m | 8 ++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/uikit/CSSLayout/Tests/CSSLayoutTests.m b/uikit/CSSLayout/Tests/CSSLayoutTests.m index 08a71416..cd550bb3 100644 --- a/uikit/CSSLayout/Tests/CSSLayoutTests.m +++ b/uikit/CSSLayout/Tests/CSSLayoutTests.m @@ -16,11 +16,24 @@ @implementation CSSLayoutTests -- (void)testSmoke +- (void)testHiddenViewsAreNotMeasured { + const CGSize firstSize = CGSizeMake(100, 100); UIView *view = [[UIView alloc] initWithFrame:CGRectZero]; [view css_setUsesFlexbox:YES]; - XCTAssertTrue([view css_usesFlexbox]); + [view css_setWidth:firstSize.width]; + [view css_setHeight:firstSize.height]; + + [view css_applyLayout]; + XCTAssertTrue(CGSizeEqualToSize(firstSize, view.frame.size)); + + const CGSize newSize = CGSizeMake(200, 200); + [view css_setWidth:newSize.width]; + [view css_setHeight:newSize.height]; + view.hidden = YES; + + [view css_applyLayout]; + XCTAssertFalse(CGSizeEqualToSize(newSize, view.frame.size)); } @end diff --git a/uikit/CSSLayout/UIView+CSSLayout.m b/uikit/CSSLayout/UIView+CSSLayout.m index 194e08ca..8fc582c5 100644 --- a/uikit/CSSLayout/UIView+CSSLayout.m +++ b/uikit/CSSLayout/UIView+CSSLayout.m @@ -226,6 +226,10 @@ static void _updateFrameRecursive(UIView *view); @end static void _attachNodesRecursive(UIView *view) { + if (view.isHidden) { + return; + } + CSSNodeRef node = [view cssNode]; const BOOL usesFlexbox = [view css_usesFlexbox]; const BOOL isLeaf = !usesFlexbox || view.subviews.count == 0; @@ -258,6 +262,10 @@ static void _attachNodesRecursive(UIView *view) { } static void _updateFrameRecursive(UIView *view) { + if (view.isHidden) { + return; + } + CSSNodeRef node = [view cssNode]; const BOOL usesFlexbox = [view css_usesFlexbox]; const BOOL isLeaf = !usesFlexbox || view.subviews.count == 0;