From 4b82cc4051c5c26d25a7f4eb451e50b202c05482 Mon Sep 17 00:00:00 2001 From: Huy Nguyen Date: Wed, 2 Sep 2015 15:01:22 +0300 Subject: [PATCH 1/3] While adjusting position of a node, use getters and setters. Those methods already check thread affinity and layer readiness. --- AsyncDisplayKit/ASDisplayNode.mm | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 59d0b7833a..13e74b9d7f 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -601,25 +601,20 @@ void ASDisplayNodeRespectThreadAffinityOfNode(ASDisplayNode *node, void (^block) // This is the root node. Trigger a full measurement pass on *current* thread. Old constrained size is re-used. [self measureWithSizeRange:oldConstrainedSize]; - CGSize oldSize = self.bounds.size; + CGRect oldBounds = self.bounds; + CGSize oldSize = oldBounds.size; CGSize newSize = _layout.size; if (! CGSizeEqualToSize(oldSize, newSize)) { - CGRect bounds = self.bounds; - bounds.size = newSize; - self.bounds = bounds; + self.bounds = (CGRect){ oldBounds.origin, newSize }; // Frame's origin must be preserved. Since it is computed from bounds size, anchorPoint // and position (see frame setter in ASDisplayNode+UIViewBridge), position needs to be adjusted. - BOOL useLayer = (_layer && ASDisplayNodeThreadIsMain()); - CGPoint anchorPoint = (useLayer ? _layer.anchorPoint : self.anchorPoint); - CGPoint oldPosition = (useLayer ? _layer.position : self.position); - + CGPoint anchorPoint = self.anchorPoint; + CGPoint oldPosition = self.position; CGFloat xDelta = (newSize.width - oldSize.width) * anchorPoint.x; CGFloat yDelta = (newSize.height - oldSize.height) * anchorPoint.y; - CGPoint newPosition = CGPointMake(oldPosition.x + xDelta, oldPosition.y + yDelta); - - useLayer ? _layer.position = newPosition : self.position = newPosition; + self.position = CGPointMake(oldPosition.x + xDelta, oldPosition.y + yDelta); } } } From 93e53bbd87077c1a058dd80ae587f5bff2b36047 Mon Sep 17 00:00:00 2001 From: Huy Nguyen Date: Wed, 2 Sep 2015 15:21:19 +0300 Subject: [PATCH 2/3] Use getter and setter of other properties in ASDisplayNode's frame setter. --- .../Private/ASDisplayNode+UIViewBridge.mm | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/AsyncDisplayKit/Private/ASDisplayNode+UIViewBridge.mm b/AsyncDisplayKit/Private/ASDisplayNode+UIViewBridge.mm index ef013a97c2..4490654258 100644 --- a/AsyncDisplayKit/Private/ASDisplayNode+UIViewBridge.mm +++ b/AsyncDisplayKit/Private/ASDisplayNode+UIViewBridge.mm @@ -143,22 +143,12 @@ ASDisplayNodeAssert(CATransform3DIsIdentity(self.transform), @"Must be an identity transform"); #endif - BOOL useLayer = (_layer && ASDisplayNodeThreadIsMain()); + CGPoint origin = self.bounds.origin; + CGPoint anchorPoint = self.anchorPoint; - CGPoint origin = (useLayer ? _layer.bounds.origin : self.bounds.origin); - CGPoint anchorPoint = (useLayer ? _layer.anchorPoint : self.anchorPoint); - - CGRect bounds = (CGRect){ origin, rect.size }; - CGPoint position = CGPointMake(rect.origin.x + rect.size.width * anchorPoint.x, - rect.origin.y + rect.size.height * anchorPoint.y); - - if (useLayer) { - _layer.bounds = bounds; - _layer.position = position; - } else { - self.bounds = bounds; - self.position = position; - } + self.bounds = (CGRect){ origin, rect.size }; + self.position = CGPointMake(rect.origin.x + rect.size.width * anchorPoint.x, + rect.origin.y + rect.size.height * anchorPoint.y); } - (void)setNeedsDisplay From 22fba5a108ee783f3ab97af6bbe1c203dd97d5aa Mon Sep 17 00:00:00 2001 From: Huy Nguyen Date: Thu, 1 Oct 2015 11:13:49 +0300 Subject: [PATCH 3/3] Revert "Use getter and setter of other properties in ASDisplayNode's frame setter." This reverts commit 93e53bbd87077c1a058dd80ae587f5bff2b36047. --- .../Private/ASDisplayNode+UIViewBridge.mm | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/AsyncDisplayKit/Private/ASDisplayNode+UIViewBridge.mm b/AsyncDisplayKit/Private/ASDisplayNode+UIViewBridge.mm index 4490654258..ef013a97c2 100644 --- a/AsyncDisplayKit/Private/ASDisplayNode+UIViewBridge.mm +++ b/AsyncDisplayKit/Private/ASDisplayNode+UIViewBridge.mm @@ -143,12 +143,22 @@ ASDisplayNodeAssert(CATransform3DIsIdentity(self.transform), @"Must be an identity transform"); #endif - CGPoint origin = self.bounds.origin; - CGPoint anchorPoint = self.anchorPoint; + BOOL useLayer = (_layer && ASDisplayNodeThreadIsMain()); - self.bounds = (CGRect){ origin, rect.size }; - self.position = CGPointMake(rect.origin.x + rect.size.width * anchorPoint.x, - rect.origin.y + rect.size.height * anchorPoint.y); + CGPoint origin = (useLayer ? _layer.bounds.origin : self.bounds.origin); + CGPoint anchorPoint = (useLayer ? _layer.anchorPoint : self.anchorPoint); + + CGRect bounds = (CGRect){ origin, rect.size }; + CGPoint position = CGPointMake(rect.origin.x + rect.size.width * anchorPoint.x, + rect.origin.y + rect.size.height * anchorPoint.y); + + if (useLayer) { + _layer.bounds = bounds; + _layer.position = position; + } else { + self.bounds = bounds; + self.position = position; + } } - (void)setNeedsDisplay