From 42f56defbf09b55109626b1740e65768e8ff1271 Mon Sep 17 00:00:00 2001 From: Alexey Glushkov Date: Sun, 22 Nov 2015 11:56:12 +0300 Subject: [PATCH 1/6] ASTextNode wrong text layout fix --- AsyncDisplayKit/ASTextNode.mm | 38 ++++++++++++++++++++++------------- Podfile.lock | 2 +- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/AsyncDisplayKit/ASTextNode.mm b/AsyncDisplayKit/ASTextNode.mm index 0f78ac960d..3b3c41347b 100644 --- a/AsyncDisplayKit/ASTextNode.mm +++ b/AsyncDisplayKit/ASTextNode.mm @@ -246,25 +246,13 @@ static NSString *ASTextNodeTruncationTokenAttributeName = @"ASTextNodeTruncation - (void)setFrame:(CGRect)frame { [super setFrame:frame]; - if (!CGSizeEqualToSize(frame.size, _constrainedSize)) { - // Our bounds have changed to a size that is not identical to our constraining size, - // so our previous layout information is invalid, and TextKit may draw at the - // incorrect origin. - _constrainedSize = CGSizeMake(-INFINITY, -INFINITY); - [self _invalidateRenderer]; - } + [self _invalidateRendererIfNeeded:frame.size]; } - (void)setBounds:(CGRect)bounds { [super setBounds:bounds]; - if (!CGSizeEqualToSize(bounds.size, _constrainedSize)) { - // Our bounds have changed to a size that is not identical to our constraining size, - // so our previous layout information is invalid, and TextKit may draw at the - // incorrect origin. - _constrainedSize = CGSizeMake(-INFINITY, -INFINITY); - [self _invalidateRenderer]; - } + [self _invalidateRendererIfNeeded:bounds.size]; } #pragma mark - Renderer Management @@ -299,6 +287,26 @@ static NSString *ASTextNodeTruncationTokenAttributeName = @"ASTextNodeTruncation _renderer = nil; } +- (BOOL)_needInvalidateRenderer:(CGSize)newSize +{ + return !CGSizeEqualToSize(newSize, _constrainedSize); +} + +- (void)_invalidateRendererIfNeeded { + [self _invalidateRendererIfNeeded:self.view.bounds.size]; +} + +- (void)_invalidateRendererIfNeeded:(CGSize)newSize +{ + if ([self _needInvalidateRenderer:newSize]) { + // Our bounds of frame have changed to a size that is not identical to our constraining size, + // so our previous layout information is invalid, and TextKit may draw at the + // incorrect origin. + _constrainedSize = CGSizeMake(-INFINITY, -INFINITY); + [self _invalidateRenderer]; + } +} + #pragma mark - Shadow Drawer Management - (ASTextNodeShadower *)_shadower { @@ -410,6 +418,8 @@ static NSString *ASTextNodeTruncationTokenAttributeName = @"ASTextNodeTruncation - (NSObject *)drawParametersForAsyncLayer:(_ASDisplayLayer *)layer { + [self _invalidateRendererIfNeeded]; + // Offset the text origin by any shadow padding UIEdgeInsets shadowPadding = [self shadowPadding]; CGPoint textOrigin = CGPointMake(self.bounds.origin.x - shadowPadding.left, self.bounds.origin.y - shadowPadding.top); diff --git a/Podfile.lock b/Podfile.lock index cf8e89d790..cb01b76e45 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -10,4 +10,4 @@ SPEC CHECKSUMS: FBSnapshotTestCase: 3dc3899168747a0319c5278f5b3445c13a6532dd OCMock: a6a7dc0e3997fb9f35d99f72528698ebf60d64f2 -COCOAPODS: 0.38.2 +COCOAPODS: 0.39.0 From 38ded30da9fb9298bf411078f8c1ec08b0640bdb Mon Sep 17 00:00:00 2001 From: Alexey Glushkov Date: Tue, 24 Nov 2015 10:01:02 +0300 Subject: [PATCH 2/6] add layer backed text node support for the fix --- AsyncDisplayKit/ASTextNode.mm | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/AsyncDisplayKit/ASTextNode.mm b/AsyncDisplayKit/ASTextNode.mm index 3b3c41347b..cedc1ac112 100644 --- a/AsyncDisplayKit/ASTextNode.mm +++ b/AsyncDisplayKit/ASTextNode.mm @@ -287,13 +287,19 @@ static NSString *ASTextNodeTruncationTokenAttributeName = @"ASTextNodeTruncation _renderer = nil; } -- (BOOL)_needInvalidateRenderer:(CGSize)newSize -{ - return !CGSizeEqualToSize(newSize, _constrainedSize); +- (void)_invalidateRendererIfNeeded { + [self _invalidateRendererIfNeeded:[self displaySize]]; } -- (void)_invalidateRendererIfNeeded { - [self _invalidateRendererIfNeeded:self.view.bounds.size]; +- (CGSize)displaySize { + CGSize resultSize = CGSizeZero; + if (self.isLayerBacked) { + resultSize = self.layer.bounds.size; + } else { + resultSize = self.view.bounds.size; + } + + return resultSize; } - (void)_invalidateRendererIfNeeded:(CGSize)newSize @@ -307,6 +313,11 @@ static NSString *ASTextNodeTruncationTokenAttributeName = @"ASTextNodeTruncation } } +- (BOOL)_needInvalidateRenderer:(CGSize)newSize +{ + return !CGSizeEqualToSize(newSize, _constrainedSize); +} + #pragma mark - Shadow Drawer Management - (ASTextNodeShadower *)_shadower { From 1d986f607b1806b6daacbe868ec04889020400ad Mon Sep 17 00:00:00 2001 From: Alexey Glushkov Date: Tue, 24 Nov 2015 10:04:42 +0300 Subject: [PATCH 3/6] reverted Podfile.lock --- Podfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Podfile.lock b/Podfile.lock index cb01b76e45..cf8e89d790 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -10,4 +10,4 @@ SPEC CHECKSUMS: FBSnapshotTestCase: 3dc3899168747a0319c5278f5b3445c13a6532dd OCMock: a6a7dc0e3997fb9f35d99f72528698ebf60d64f2 -COCOAPODS: 0.39.0 +COCOAPODS: 0.38.2 From e859f9a870394e9b805586cea634cbf11c169cd8 Mon Sep 17 00:00:00 2001 From: Alexey Glushkov Date: Tue, 24 Nov 2015 10:07:32 +0300 Subject: [PATCH 4/6] fixed brace style --- AsyncDisplayKit/ASTextNode.mm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/AsyncDisplayKit/ASTextNode.mm b/AsyncDisplayKit/ASTextNode.mm index cedc1ac112..be5ab82e8c 100644 --- a/AsyncDisplayKit/ASTextNode.mm +++ b/AsyncDisplayKit/ASTextNode.mm @@ -287,18 +287,20 @@ static NSString *ASTextNodeTruncationTokenAttributeName = @"ASTextNodeTruncation _renderer = nil; } -- (void)_invalidateRendererIfNeeded { +- (void)_invalidateRendererIfNeeded +{ [self _invalidateRendererIfNeeded:[self displaySize]]; } -- (CGSize)displaySize { +- (CGSize)displaySize +{ CGSize resultSize = CGSizeZero; if (self.isLayerBacked) { resultSize = self.layer.bounds.size; } else { resultSize = self.view.bounds.size; } - + return resultSize; } From 01a2fd90d492c9330f72e0ea2987b3c9de02cc68 Mon Sep 17 00:00:00 2001 From: Alexey Glushkov Date: Tue, 24 Nov 2015 11:12:36 +0300 Subject: [PATCH 5/6] removed displaySize method, added condition to skip _invalidateRendererIfNeeded if there are no view and no layer --- AsyncDisplayKit/ASTextNode.mm | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/AsyncDisplayKit/ASTextNode.mm b/AsyncDisplayKit/ASTextNode.mm index be5ab82e8c..9c0bd9d79d 100644 --- a/AsyncDisplayKit/ASTextNode.mm +++ b/AsyncDisplayKit/ASTextNode.mm @@ -289,19 +289,7 @@ static NSString *ASTextNodeTruncationTokenAttributeName = @"ASTextNodeTruncation - (void)_invalidateRendererIfNeeded { - [self _invalidateRendererIfNeeded:[self displaySize]]; -} - -- (CGSize)displaySize -{ - CGSize resultSize = CGSizeZero; - if (self.isLayerBacked) { - resultSize = self.layer.bounds.size; - } else { - resultSize = self.view.bounds.size; - } - - return resultSize; + [self _invalidateRendererIfNeeded:self.bounds.size]; } - (void)_invalidateRendererIfNeeded:(CGSize)newSize @@ -317,7 +305,8 @@ static NSString *ASTextNodeTruncationTokenAttributeName = @"ASTextNodeTruncation - (BOOL)_needInvalidateRenderer:(CGSize)newSize { - return !CGSizeEqualToSize(newSize, _constrainedSize); + BOOL hasViewOrLayer = self.view || self.layer; + return hasViewOrLayer && !CGSizeEqualToSize(newSize, _constrainedSize); } #pragma mark - Shadow Drawer Management From c501e46b5de8af832c5f2e69aac988c9efa1cc9f Mon Sep 17 00:00:00 2001 From: Alexey Glushkov Date: Tue, 24 Nov 2015 11:35:20 +0300 Subject: [PATCH 6/6] removed wrong conditions in _needInvalidateRenderer --- AsyncDisplayKit/ASTextNode.mm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/AsyncDisplayKit/ASTextNode.mm b/AsyncDisplayKit/ASTextNode.mm index 9c0bd9d79d..4cd7cf8f2c 100644 --- a/AsyncDisplayKit/ASTextNode.mm +++ b/AsyncDisplayKit/ASTextNode.mm @@ -305,8 +305,7 @@ static NSString *ASTextNodeTruncationTokenAttributeName = @"ASTextNodeTruncation - (BOOL)_needInvalidateRenderer:(CGSize)newSize { - BOOL hasViewOrLayer = self.view || self.layer; - return hasViewOrLayer && !CGSizeEqualToSize(newSize, _constrainedSize); + return !CGSizeEqualToSize(newSize, _constrainedSize); } #pragma mark - Shadow Drawer Management