Fix spoiler dust on truncated lines

This commit is contained in:
Ilya Laktyushin
2021-12-18 23:44:55 +04:00
parent 2a1d8af744
commit 5ddfb0dd63
3 changed files with 6 additions and 5 deletions

View File

@@ -973,7 +973,7 @@ public class TextNode: ASDisplayNode {
let lineCharacterCount = CTTypesetterSuggestLineBreak(typesetter, lastLineCharacterIndex, Double(lineConstrainedWidth)) let lineCharacterCount = CTTypesetterSuggestLineBreak(typesetter, lastLineCharacterIndex, Double(lineConstrainedWidth))
func addSpoiler(line: CTLine, ascent: CGFloat, descent: CGFloat, startIndex: Int, endIndex: Int) { func addSpoiler(line: CTLine, ascent: CGFloat, descent: CGFloat, startIndex: Int, endIndex: Int, rightInset: CGFloat = 0.0) {
var secondaryLeftOffset: CGFloat = 0.0 var secondaryLeftOffset: CGFloat = 0.0
let rawLeftOffset = CTLineGetOffsetForStringIndex(line, startIndex, &secondaryLeftOffset) let rawLeftOffset = CTLineGetOffsetForStringIndex(line, startIndex, &secondaryLeftOffset)
var leftOffset = floor(rawLeftOffset) var leftOffset = floor(rawLeftOffset)
@@ -988,7 +988,7 @@ public class TextNode: ASDisplayNode {
rightOffset = ceil(secondaryRightOffset) rightOffset = ceil(secondaryRightOffset)
} }
spoilers.append(TextNodeSpoiler(range: NSMakeRange(startIndex, endIndex - startIndex + 1), frame: CGRect(x: min(leftOffset, rightOffset), y: descent - (ascent + descent), width: abs(rightOffset - leftOffset), height: ascent + descent))) spoilers.append(TextNodeSpoiler(range: NSMakeRange(startIndex, endIndex - startIndex + 1), frame: CGRect(x: min(leftOffset, rightOffset), y: descent - (ascent + descent), width: abs(rightOffset - leftOffset) + rightInset, height: ascent + descent)))
} }
var isLastLine = false var isLastLine = false
@@ -1033,6 +1033,7 @@ public class TextNode: ASDisplayNode {
let truncationToken = CTLineCreateWithAttributedString(truncatedTokenString) let truncationToken = CTLineCreateWithAttributedString(truncatedTokenString)
coreTextLine = CTLineCreateTruncatedLine(originalLine, Double(lineConstrainedSize.width), truncationType, truncationToken) ?? truncationToken coreTextLine = CTLineCreateTruncatedLine(originalLine, Double(lineConstrainedSize.width), truncationType, truncationToken) ?? truncationToken
brokenLineRange.length = CTLineGetGlyphCount(coreTextLine) - 1
truncated = true truncated = true
} }
@@ -1063,7 +1064,7 @@ public class TextNode: ASDisplayNode {
if let currentStartIndex = startIndex, let currentIndex = currentIndex { if let currentStartIndex = startIndex, let currentIndex = currentIndex {
startIndex = nil startIndex = nil
let endIndex = currentIndex let endIndex = currentIndex
addSpoiler(line: coreTextLine, ascent: ascent, descent: descent, startIndex: currentStartIndex, endIndex: endIndex) addSpoiler(line: coreTextLine, ascent: ascent, descent: descent, startIndex: currentStartIndex, endIndex: endIndex, rightInset: truncated ? 12.0 : 0.0)
} }
} else if let _ = attributes[NSAttributedString.Key.strikethroughStyle] { } else if let _ = attributes[NSAttributedString.Key.strikethroughStyle] {
let lowerX = floor(CTLineGetOffsetForStringIndex(coreTextLine, range.location, nil)) let lowerX = floor(CTLineGetOffsetForStringIndex(coreTextLine, range.location, nil))

View File

@@ -250,8 +250,8 @@ class ChatMessageReplyInfoNode: ASDisplayNode {
node.dustNode = dustNode node.dustNode = dustNode
node.contentNode.insertSubnode(dustNode, aboveSubnode: textNode) node.contentNode.insertSubnode(dustNode, aboveSubnode: textNode)
} }
dustNode.update(size: textFrame.size, color: titleColor, rects: textLayout.spoilers.map { $0.offsetBy(dx: 3.0, dy: 3.0).insetBy(dx: 1.0, dy: 1.0) })
dustNode.frame = textFrame.insetBy(dx: -3.0, dy: -3.0).offsetBy(dx: 0.0, dy: 3.0) dustNode.frame = textFrame.insetBy(dx: -3.0, dy: -3.0).offsetBy(dx: 0.0, dy: 3.0)
dustNode.update(size: dustNode.frame.size, color: titleColor, rects: textLayout.spoilers.map { $0.offsetBy(dx: 3.0, dy: 3.0).insetBy(dx: 1.0, dy: 1.0) })
} else if let dustNode = node.dustNode { } else if let dustNode = node.dustNode {
dustNode.removeFromSupernode() dustNode.removeFromSupernode()
node.dustNode = nil node.dustNode = nil

View File

@@ -404,8 +404,8 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode {
strongSelf.dustNode = dustNode strongSelf.dustNode = dustNode
strongSelf.insertSubnode(dustNode, aboveSubnode: spoilerTextNode) strongSelf.insertSubnode(dustNode, aboveSubnode: spoilerTextNode)
} }
dustNode.update(size: textFrame.size, color: messageTheme.secondaryTextColor, rects: textLayout.spoilers.map { $0.offsetBy(dx: 3.0, dy: 3.0).insetBy(dx: 1.0, dy: 1.0) })
dustNode.frame = textFrame.insetBy(dx: -3.0, dy: -3.0).offsetBy(dx: 0.0, dy: 3.0) dustNode.frame = textFrame.insetBy(dx: -3.0, dy: -3.0).offsetBy(dx: 0.0, dy: 3.0)
dustNode.update(size: dustNode.frame.size, color: messageTheme.secondaryTextColor, rects: textLayout.spoilers.map { $0.offsetBy(dx: 3.0, dy: 3.0).insetBy(dx: 1.0, dy: 1.0) })
} else if let spoilerTextNode = strongSelf.spoilerTextNode { } else if let spoilerTextNode = strongSelf.spoilerTextNode {
strongSelf.spoilerTextNode = nil strongSelf.spoilerTextNode = nil
spoilerTextNode.removeFromSupernode() spoilerTextNode.removeFromSupernode()