mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Fix spoiler dust on truncated lines
This commit is contained in:
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user