Skip to content

Commit

Permalink
[ASTextKitCoreTextAdditions] Adds mappings for kCTParagraphStyleSpeci…
Browse files Browse the repository at this point in the history
…fierMinimumLineSpacing, kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineSpacingAdjustment when mapping CTParagraphStyle onto NSParagraphStyle

[ASTextNode] Uses CoreText-cleansed attributed string when assigning ascender/descender to avoid crash when a CTParagraphStyle is passed as an attribute
  • Loading branch information
alexhillc committed Jan 6, 2018
1 parent bf9aa78 commit 8eb2dbe
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 10 deletions.
8 changes: 4 additions & 4 deletions Source/ASTextNode.mm
Original file line number Diff line number Diff line change
Expand Up @@ -447,10 +447,10 @@ - (void)setAttributedText:(NSAttributedString *)attributedText
// Since truncation text matches style of attributedText, invalidate it now.
[self _invalidateTruncationText];

NSUInteger length = attributedText.length;
NSUInteger length = _attributedText.length;
if (length > 0) {
self.style.ascender = [[self class] ascenderWithAttributedString:attributedText];
self.style.descender = [[attributedText attribute:NSFontAttributeName atIndex:attributedText.length - 1 effectiveRange:NULL] descender];
self.style.ascender = [[self class] ascenderWithAttributedString:_attributedText];
self.style.descender = [[_attributedText attribute:NSFontAttributeName atIndex:length - 1 effectiveRange:NULL] descender];
}

// Tell the display node superclasses that the cached layout is incorrect now
Expand All @@ -461,7 +461,7 @@ - (void)setAttributedText:(NSAttributedString *)attributedText


// Accessiblity
self.accessibilityLabel = attributedText.string;
self.accessibilityLabel = _attributedText.string;
self.isAccessibilityElement = (length != 0); // We're an accessibility element by default if there is a string.
}

Expand Down
29 changes: 23 additions & 6 deletions Source/TextKit/ASTextKitCoreTextAdditions.m
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ BOOL ASAttributeWithNameIsUnsupportedCoreTextAttribute(NSString *attributeName)
kCTBaselineInfoAttributeName,
kCTBaselineReferenceInfoAttributeName,
kCTUnderlineColorAttributeName,
kCTParagraphStyleAttributeName,
nil];
});
return [coreTextAttributes containsObject:attributeName];
Expand Down Expand Up @@ -227,17 +228,33 @@ + (instancetype)paragraphStyleWithCTParagraphStyle:(CTParagraphStyleRef)coreText
CGFloat minimumLineHeight;
if (CTParagraphStyleGetValueForSpecifier(coreTextParagraphStyle, kCTParagraphStyleSpecifierMinimumLineHeight, sizeof(minimumLineHeight), &minimumLineHeight))
newParagraphStyle.minimumLineHeight = minimumLineHeight;


CGFloat lineSpacing = 0;
#if TARGET_OS_IOS
// kCTParagraphStyleSpecifierLineSpacing -> lineSpacing
// Note that kCTParagraphStyleSpecifierLineSpacing is deprecated and will die soon. We should not be using it.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
CGFloat lineSpacing;
if (CTParagraphStyleGetValueForSpecifier(coreTextParagraphStyle, kCTParagraphStyleSpecifierLineSpacing, sizeof(lineSpacing), &lineSpacing))
newParagraphStyle.lineSpacing = lineSpacing;
// kCTParagraphStyleSpecifierLineSpacing -> lineSpacing
// Note that kCTParagraphStyleSpecifierLineSpacing is deprecated and will die soon. We should not be using it.
if (CTParagraphStyleGetValueForSpecifier(coreTextParagraphStyle, kCTParagraphStyleSpecifierLineSpacing, sizeof(lineSpacing), &lineSpacing))
newParagraphStyle.lineSpacing = lineSpacing;
#pragma clang diagnostic pop
#endif

// Attempt to weakly map the following onto -[NSParagraphStyle lineSpacing]:
// - kCTParagraphStyleSpecifierMinimumLineSpacing
// - kCTParagraphStyleSpecifierMaximumLineSpacing
// - kCTParagraphStyleSpecifierLineSpacingAdjustment
if (fabs(lineSpacing) <= FLT_EPSILON &&
CTParagraphStyleGetValueForSpecifier(coreTextParagraphStyle, kCTParagraphStyleSpecifierMinimumLineSpacing, sizeof(lineSpacing), &lineSpacing))
newParagraphStyle.lineSpacing = lineSpacing;

if (fabs(lineSpacing) <= FLT_EPSILON &&
CTParagraphStyleGetValueForSpecifier(coreTextParagraphStyle, kCTParagraphStyleSpecifierMaximumLineSpacing, sizeof(lineSpacing), &lineSpacing))
newParagraphStyle.lineSpacing = lineSpacing;

if (fabs(lineSpacing) <= FLT_EPSILON &&
CTParagraphStyleGetValueForSpecifier(coreTextParagraphStyle, kCTParagraphStyleSpecifierLineSpacingAdjustment, sizeof(lineSpacing), &lineSpacing))
newParagraphStyle.lineSpacing = lineSpacing;

// kCTParagraphStyleSpecifierParagraphSpacing -> paragraphSpacing
CGFloat paragraphSpacing;
Expand Down

0 comments on commit 8eb2dbe

Please sign in to comment.