diff --git a/AsyncDisplayKit/ASTextNode.mm b/AsyncDisplayKit/ASTextNode.mm index 237c043431..daecff0714 100644 --- a/AsyncDisplayKit/ASTextNode.mm +++ b/AsyncDisplayKit/ASTextNode.mm @@ -337,7 +337,18 @@ static NSArray *DefaultLinkAttributeNames = @[ NSLinkAttributeName ]; [self setNeedsDisplay]; - return [[self _renderer] size]; + CGSize size = [[self _renderer] size]; + if (self.attributedString.length > 0) { + CGFloat screenScale = ASScreenScale(); + self.ascender = round([[_attributedString attribute:NSFontAttributeName atIndex:0 effectiveRange:NULL] ascender] * screenScale)/screenScale; + self.descender = round([[_attributedString attribute:NSFontAttributeName atIndex:_attributedString.length - 1 effectiveRange:NULL] descender] * screenScale)/screenScale; + if (_renderer.currentScaleFactor > 0 && _renderer.currentScaleFactor < 1.0) { + // while not perfect, this is a good estimate of what the ascender of the scaled font will be. + self.ascender *= _renderer.currentScaleFactor; + self.descender *= _renderer.currentScaleFactor; + } + } + return size; } #pragma mark - Modifying User Text @@ -375,12 +386,6 @@ static NSArray *DefaultLinkAttributeNames = @[ NSLinkAttributeName ]; } else { self.isAccessibilityElement = YES; } - - if (attributedString.length > 0) { - CGFloat screenScale = ASScreenScale(); - self.ascender = round([[attributedString attribute:NSFontAttributeName atIndex:0 effectiveRange:NULL] ascender] * screenScale)/screenScale; - self.descender = round([[attributedString attribute:NSFontAttributeName atIndex:attributedString.length - 1 effectiveRange:NULL] descender] * screenScale)/screenScale; - } } #pragma mark - Text Layout diff --git a/AsyncDisplayKit/TextKit/ASTextKitFontSizeAdjuster.mm b/AsyncDisplayKit/TextKit/ASTextKitFontSizeAdjuster.mm index f881ae5f34..5a2289582d 100644 --- a/AsyncDisplayKit/TextKit/ASTextKitFontSizeAdjuster.mm +++ b/AsyncDisplayKit/TextKit/ASTextKitFontSizeAdjuster.mm @@ -20,6 +20,8 @@ __weak ASTextKitContext *_context; ASTextKitAttributes _attributes; std::mutex _textKitMutex; + BOOL _measured; + CGFloat _scaleFactor; } - (instancetype)initWithContext:(ASTextKitContext *)context @@ -85,7 +87,7 @@ NSLayoutManager *layoutManager = _attributes.layoutManagerCreationBlock ? _attributes.layoutManagerCreationBlock() : [[ASLayoutManager alloc] init]; layoutManager.usesFontLeading = NO; [textStorage addLayoutManager:layoutManager]; - NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:_constrainedSize]; + NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(_constrainedSize.width, FLT_MAX)]; textContainer.lineFragmentPadding = 0; textContainer.lineBreakMode = _attributes.lineBreakMode; @@ -104,8 +106,14 @@ - (CGFloat)scaleFactor { + if (_measured) { + return _scaleFactor; + } + if ([_attributes.pointSizeScaleFactors count] == 0 || isinf(_constrainedSize.width)) { - return 1.0; + _measured = YES; + _scaleFactor = 1.0; + return _scaleFactor; } __block CGFloat adjustedScale = 1.0; @@ -177,7 +185,9 @@ } }]; - return adjustedScale; + _measured = YES; + _scaleFactor = adjustedScale; + return _scaleFactor; } @end