Made a few changes to font scale adjustment

1) cache the scale in the font adjuster. The adjuster will be dealloc'ed when the renderer that owns it is dealloc'ed (or invalidated). Until that time we can trust the scale that the adjuster has computed.
2) When measuring line count, make sure that we are not bounding the height of the container's size. This will cause the wrong number of lines to be returned.
3) Instead of setting the ascender/descender on an ASTextNode when an attributed string is added, wait until after the renderer calculates size. This way, if there is any need to scale the font to fit we can apply that scale to the ascender/descender.
This commit is contained in:
rcancro 2016-03-08 12:05:26 -08:00
parent 39f5686982
commit 3ebdf5928c
2 changed files with 25 additions and 10 deletions

View File

@ -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

View File

@ -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