sharp corners respect RTL

pull/1/head
Michael Kirk 7 years ago
parent fa89a84daf
commit 37c4a802e4

@ -9,6 +9,14 @@ NS_ASSUME_NONNULL_BEGIN
extern const CGFloat kOWSMessageCellCornerRadius_Large;
extern const CGFloat kOWSMessageCellCornerRadius_Small;
typedef NS_OPTIONS(NSUInteger, OWSDirectionalRectCorner) {
OWSDirectionalRectCornerTopLeading = 1 << 0,
OWSDirectionalRectCornerTopTrailing = 1 << 1,
OWSDirectionalRectCornerBottomLeading = 1 << 2,
OWSDirectionalRectCornerBottomTrailing = 1 << 3,
OWSDirectionalRectCornerAllCorners = ~0UL
};
@class OWSBubbleView;
@protocol OWSBubbleViewPartner <NSObject>
@ -29,11 +37,11 @@ extern const CGFloat kOWSMessageCellCornerRadius_Small;
bubbleRight:(CGFloat)bubbleRight
sharpCornerRadius:(CGFloat)sharpCornerRadius
wideCornerRadius:(CGFloat)wideCornerRadius
sharpCorners:(UIRectCorner)sharpCorners;
sharpCorners:(OWSDirectionalRectCorner)sharpCorners;
@property (nonatomic, nullable) UIColor *bubbleColor;
@property (nonatomic) UIRectCorner sharpCorners;
@property (nonatomic) OWSDirectionalRectCorner sharpCorners;
- (UIBezierPath *)maskPath;

@ -3,10 +3,40 @@
//
#import "OWSBubbleView.h"
#import "MainAppContext.h"
#import <SignalMessaging/UIView+OWS.h>
NS_ASSUME_NONNULL_BEGIN
UIRectCorner UIRectCornerForOWSDirectionalRectCorner(OWSDirectionalRectCorner corner);
UIRectCorner UIRectCornerForOWSDirectionalRectCorner(OWSDirectionalRectCorner corner)
{
if (corner == OWSDirectionalRectCornerAllCorners) {
return UIRectCornerAllCorners;
}
UIRectCorner rectCorner = 0;
BOOL isRTL = CurrentAppContext().isRTL;
if (corner & OWSDirectionalRectCornerTopLeading) {
rectCorner = rectCorner | (isRTL ? UIRectCornerTopRight : UIRectCornerTopLeft);
}
if (corner & OWSDirectionalRectCornerTopTrailing) {
rectCorner = rectCorner | (isRTL ? UIRectCornerTopLeft : UIRectCornerTopRight);
}
if (corner & OWSDirectionalRectCornerBottomTrailing) {
rectCorner = rectCorner | (isRTL ? UIRectCornerBottomLeft : UIRectCornerBottomRight);
}
if (corner & OWSDirectionalRectCornerBottomLeading) {
rectCorner = rectCorner | (isRTL ? UIRectCornerBottomRight : UIRectCornerBottomLeft);
}
return rectCorner;
}
const CGFloat kOWSMessageCellCornerRadius_Large = 18;
const CGFloat kOWSMessageCellCornerRadius_Small = 4;
@ -101,7 +131,7 @@ const CGFloat kOWSMessageCellCornerRadius_Small = 4;
[CATransaction commit];
}
- (void)setSharpCorners:(UIRectCorner)sharpCorners
- (void)setSharpCorners:(OWSDirectionalRectCorner)sharpCorners
{
_sharpCorners = sharpCorners;
@ -135,13 +165,11 @@ const CGFloat kOWSMessageCellCornerRadius_Small = 4;
return [self.class maskPathForSize:self.bounds.size sharpCorners:self.sharpCorners];
}
+ (UIBezierPath *)maskPathForSize:(CGSize)size sharpCorners:(UIRectCorner)sharpCorners
+ (UIBezierPath *)maskPathForSize:(CGSize)size sharpCorners:(OWSDirectionalRectCorner)sharpCorners
{
CGRect bounds = CGRectZero;
bounds.size = size;
UIBezierPath *bezierPath = [UIBezierPath new];
CGFloat bubbleTop = 0.f;
CGFloat bubbleLeft = 0.f;
CGFloat bubbleBottom = size.height;
@ -162,15 +190,18 @@ const CGFloat kOWSMessageCellCornerRadius_Small = 4;
bubbleRight:(CGFloat)bubbleRight
sharpCornerRadius:(CGFloat)sharpCornerRadius
wideCornerRadius:(CGFloat)wideCornerRadius
sharpCorners:(UIRectCorner)sharpCorners
sharpCorners:(OWSDirectionalRectCorner)sharpCorners
{
UIBezierPath *bezierPath = [UIBezierPath new];
const CGFloat topLeftRounding = (sharpCorners & UIRectCornerTopLeft) ? sharpCornerRadius : wideCornerRadius;
const CGFloat topRightRounding = (sharpCorners & UIRectCornerTopRight) ? sharpCornerRadius : wideCornerRadius;
UIRectCorner uiSharpCorners = UIRectCornerForOWSDirectionalRectCorner(sharpCorners);
const CGFloat topLeftRounding = (uiSharpCorners & UIRectCornerTopLeft) ? sharpCornerRadius : wideCornerRadius;
const CGFloat topRightRounding = (uiSharpCorners & UIRectCornerTopRight) ? sharpCornerRadius : wideCornerRadius;
const CGFloat bottomRightRounding = (sharpCorners & UIRectCornerBottomRight) ? sharpCornerRadius : wideCornerRadius;
const CGFloat bottomLeftRounding = (sharpCorners & UIRectCornerBottomLeft) ? sharpCornerRadius : wideCornerRadius;
const CGFloat bottomRightRounding
= (uiSharpCorners & UIRectCornerBottomRight) ? sharpCornerRadius : wideCornerRadius;
const CGFloat bottomLeftRounding = (uiSharpCorners & UIRectCornerBottomLeft) ? sharpCornerRadius : wideCornerRadius;
const CGFloat topAngle = 3.0f * M_PI_2;
const CGFloat rightAngle = 0.0f;

@ -558,27 +558,29 @@ NS_ASSUME_NONNULL_BEGIN
return 12.f;
}
- (UIRectCorner)sharpCorners
- (OWSDirectionalRectCorner)sharpCorners
{
UIRectCorner sharpCorners = 0;
OWSDirectionalRectCorner sharpCorners = 0;
if (!self.viewItem.isFirstInCluster) {
sharpCorners = sharpCorners | (self.isIncoming ? UIRectCornerTopLeft : UIRectCornerTopRight);
sharpCorners = sharpCorners
| (self.isIncoming ? OWSDirectionalRectCornerTopLeading : OWSDirectionalRectCornerTopTrailing);
}
if (!self.viewItem.isLastInCluster) {
sharpCorners = sharpCorners | (self.isIncoming ? UIRectCornerBottomLeft : UIRectCornerBottomRight);
sharpCorners = sharpCorners
| (self.isIncoming ? OWSDirectionalRectCornerBottomLeading : OWSDirectionalRectCornerBottomTrailing);
}
return sharpCorners;
}
- (UIRectCorner)sharpCornersForQuotedMessage
- (OWSDirectionalRectCorner)sharpCornersForQuotedMessage
{
if (self.viewItem.senderName) {
return UIRectCornerAllCorners;
return OWSDirectionalRectCornerAllCorners;
} else {
return self.sharpCorners | UIRectCornerBottomLeft | UIRectCornerBottomRight;
return self.sharpCorners | OWSDirectionalRectCornerBottomLeading | OWSDirectionalRectCornerBottomTrailing;
}
}

@ -2,6 +2,8 @@
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
#import "OWSBubbleView.h"
NS_ASSUME_NONNULL_BEGIN
@class ConversationStyle;
@ -35,7 +37,7 @@ NS_ASSUME_NONNULL_BEGIN
displayableQuotedText:(nullable DisplayableText *)displayableQuotedText
conversationStyle:(ConversationStyle *)conversationStyle
isOutgoing:(BOOL)isOutgoing
sharpCorners:(UIRectCorner)sharpCorners;
sharpCorners:(OWSDirectionalRectCorner)sharpCorners;
// Factory method for "message compose" views.
+ (OWSQuotedMessageView *)quotedMessageViewForPreview:(OWSQuotedReplyModel *)quotedMessage

@ -25,7 +25,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly) BOOL isForPreview;
@property (nonatomic, readonly) BOOL isOutgoing;
@property (nonatomic, readonly) UIRectCorner sharpCorners;
@property (nonatomic, readonly) OWSDirectionalRectCorner sharpCorners;
@property (nonatomic, readonly) UILabel *quotedAuthorLabel;
@property (nonatomic, readonly) UILabel *quotedTextLabel;
@ -40,7 +40,7 @@ NS_ASSUME_NONNULL_BEGIN
displayableQuotedText:(nullable DisplayableText *)displayableQuotedText
conversationStyle:(ConversationStyle *)conversationStyle
isOutgoing:(BOOL)isOutgoing
sharpCorners:(UIRectCorner)sharpCorners
sharpCorners:(OWSDirectionalRectCorner)sharpCorners
{
OWSAssert(quotedMessage);
@ -62,12 +62,13 @@ NS_ASSUME_NONNULL_BEGIN
displayableQuotedText = [DisplayableText displayableText:quotedMessage.body];
}
OWSQuotedMessageView *instance = [[OWSQuotedMessageView alloc] initWithQuotedMessage:quotedMessage
displayableQuotedText:displayableQuotedText
conversationStyle:conversationStyle
isForPreview:YES
isOutgoing:YES
sharpCorners:UIRectCornerAllCorners];
OWSQuotedMessageView *instance =
[[OWSQuotedMessageView alloc] initWithQuotedMessage:quotedMessage
displayableQuotedText:displayableQuotedText
conversationStyle:conversationStyle
isForPreview:YES
isOutgoing:YES
sharpCorners:OWSDirectionalRectCornerAllCorners];
[instance createContents];
return instance;
}
@ -77,7 +78,7 @@ NS_ASSUME_NONNULL_BEGIN
conversationStyle:(ConversationStyle *)conversationStyle
isForPreview:(BOOL)isForPreview
isOutgoing:(BOOL)isOutgoing
sharpCorners:(UIRectCorner)sharpCorners
sharpCorners:(OWSDirectionalRectCorner)sharpCorners
{
self = [super init];
@ -151,7 +152,7 @@ NS_ASSUME_NONNULL_BEGIN
self.clipsToBounds = YES;
CAShapeLayer *maskLayer = [CAShapeLayer new];
UIRectCorner sharpCorners = self.sharpCorners;
OWSDirectionalRectCorner sharpCorners = self.sharpCorners;
OWSLayerView *innerBubbleView = [[OWSLayerView alloc]
initWithFrame:CGRectZero

Loading…
Cancel
Save