diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSBubbleView.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSBubbleView.m index 268dfa328..2a36a6a78 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSBubbleView.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSBubbleView.m @@ -7,7 +7,7 @@ NS_ASSUME_NONNULL_BEGIN -const CGFloat kOWSMessageCellCornerRadius_Large = 16; +const CGFloat kOWSMessageCellCornerRadius_Large = 18; const CGFloat kOWSMessageCellCornerRadius_Small = 2; @interface OWSBubbleView () @@ -161,19 +161,40 @@ const CGFloat kOWSMessageCellCornerRadius_Small = 2; CGFloat bottomRounding = (useSmallCorners_Bottom ? kOWSMessageCellCornerRadius_Small : kOWSMessageCellCornerRadius_Large); + const CGFloat topAngle = 3.0f * M_PI_2; + const CGFloat rightAngle = 0.0f; + const CGFloat bottomAngle = M_PI_2; + const CGFloat leftAngle = M_PI; + [bezierPath moveToPoint:CGPointMake(bubbleLeft + topRounding, bubbleTop)]; - [bezierPath addLineToPoint:CGPointMake(bubbleRight - topRounding, bubbleTop)]; - [bezierPath addQuadCurveToPoint:CGPointMake(bubbleRight, bubbleTop + topRounding) - controlPoint:CGPointMake(bubbleRight, bubbleTop)]; - [bezierPath addLineToPoint:CGPointMake(bubbleRight, bubbleBottom - bottomRounding)]; - [bezierPath addQuadCurveToPoint:CGPointMake(bubbleRight - bottomRounding, bubbleBottom) - controlPoint:CGPointMake(bubbleRight, bubbleBottom)]; - [bezierPath addLineToPoint:CGPointMake(bubbleLeft + bottomRounding, bubbleBottom)]; - [bezierPath addQuadCurveToPoint:CGPointMake(bubbleLeft, bubbleBottom - bottomRounding) - controlPoint:CGPointMake(bubbleLeft, bubbleBottom)]; - [bezierPath addLineToPoint:CGPointMake(bubbleLeft, bubbleTop + topRounding)]; - [bezierPath addQuadCurveToPoint:CGPointMake(bubbleLeft + topRounding, bubbleTop) - controlPoint:CGPointMake(bubbleLeft, bubbleTop)]; + + // top right corner + [bezierPath addArcWithCenter:CGPointMake(bubbleRight - topRounding, bubbleTop + topRounding) + radius:topRounding + startAngle:topAngle + endAngle:rightAngle + clockwise:true]; + + // bottom right corner + [bezierPath addArcWithCenter:CGPointMake(bubbleRight - bottomRounding, bubbleBottom - bottomRounding) + radius:bottomRounding + startAngle:rightAngle + endAngle:bottomAngle + clockwise:true]; + + // bottom left corner + [bezierPath addArcWithCenter:CGPointMake(bubbleLeft + bottomRounding, bubbleBottom - bottomRounding) + radius:bottomRounding + startAngle:bottomAngle + endAngle:leftAngle + clockwise:true]; + + // top left corner + [bezierPath addArcWithCenter:CGPointMake(bubbleLeft + topRounding, bubbleTop + topRounding) + radius:topRounding + startAngle:leftAngle + endAngle:topAngle + clockwise:true]; return bezierPath; } diff --git a/SignalMessaging/utils/ConversationStyle.swift b/SignalMessaging/utils/ConversationStyle.swift index 4f534d501..03d69ba32 100644 --- a/SignalMessaging/utils/ConversationStyle.swift +++ b/SignalMessaging/utils/ConversationStyle.swift @@ -97,16 +97,25 @@ public class ConversationStyle: NSObject { maxMessageWidth = floor(contentWidth - 48) let messageTextFont = UIFont.ows_dynamicTypeBody + + let baseFontOffset: CGFloat = 11 + // Don't include the distance from the "cap height" to the top of the UILabel // in the top margin. - textInsetTop = max(0, 12 - (messageTextFont.ascender - messageTextFont.capHeight)) + textInsetTop = max(0, round(baseFontOffset - (messageTextFont.ascender - messageTextFont.capHeight))) // Don't include the distance from the "baseline" to the bottom of the UILabel // (e.g. the descender) in the top margin. Note that UIFont.descender is a // negative value. - textInsetBottom = max(0, 12 - abs(messageTextFont.descender)) + textInsetBottom = max(0, round(baseFontOffset - abs(messageTextFont.descender))) + + if _isDebugAssertConfiguration(), UIFont.ows_dynamicTypeBody.pointSize == 17 { + assert(textInsetTop == 7) + assert(textInsetBottom == 7) + } + textInsetHorizontal = 12 - lastTextLineAxis = CGFloat(round(12 + messageTextFont.capHeight * 0.5)) + lastTextLineAxis = CGFloat(round(baseFontOffset + messageTextFont.capHeight * 0.5)) self.primaryColor = ConversationStyle.primaryColor(thread: thread) }