From 87380894ba86c9f51fa90a22b6d76f1b52d4bf04 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 28 Jun 2018 10:42:37 -0400 Subject: [PATCH] Tweak message cells. --- .../Cells/OWSMessageBubbleView.m | 52 +++++++++++-------- SignalMessaging/categories/UIView+OWS.h | 2 + SignalMessaging/categories/UIView+OWS.m | 12 +++++ 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.m index 93530e8c3..7568006e2 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.m @@ -23,7 +23,10 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) OWSBubbleView *bubbleView; -@property (nonatomic) OWSBubbleShapeView *mediaShadowView; +// TODO: We may only end up using a single shadow. +@property (nonatomic) OWSBubbleShapeView *mediaShadowView1; + +@property (nonatomic) OWSBubbleShapeView *mediaShadowView2; @property (nonatomic) OWSBubbleShapeView *mediaClipView; @@ -81,7 +84,8 @@ NS_ASSUME_NONNULL_BEGIN [self addSubview:self.bubbleView]; [self.bubbleView autoPinEdgesToSuperviewEdges]; - self.mediaShadowView = [OWSBubbleShapeView bubbleShadowView]; + self.mediaShadowView1 = [OWSBubbleShapeView bubbleShadowView]; + self.mediaShadowView2 = [OWSBubbleShapeView bubbleShadowView]; self.mediaClipView = [OWSBubbleShapeView bubbleClipView]; self.bubbleStrokeView = [OWSBubbleShapeView bubbleDrawView]; @@ -348,28 +352,33 @@ NS_ASSUME_NONNULL_BEGIN UIView *bodyProxyView = [UIView new]; [self.stackView addArrangedSubview:bodyProxyView]; - [self addSubview:self.mediaShadowView]; - [self.mediaShadowView autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:bodyProxyView]; - [self.mediaShadowView autoPinEdge:ALEdgeBottom toEdge:ALEdgeBottom ofView:bodyProxyView]; - [self.mediaShadowView autoPinEdge:ALEdgeLeading toEdge:ALEdgeLeading ofView:bodyProxyView]; - [self.mediaShadowView autoPinEdge:ALEdgeTrailing toEdge:ALEdgeTrailing ofView:bodyProxyView]; + [self addSubview:self.mediaShadowView1]; + [self addSubview:self.mediaShadowView2]; + [self addSubview:self.mediaClipView]; - [self.mediaShadowView addSubview:self.mediaClipView]; - [self.mediaClipView autoPinToSuperviewEdges]; + [self.viewConstraints addObjectsFromArray:[self.mediaShadowView1 autoPinToEdgesOfView:bodyProxyView]]; + [self.viewConstraints addObjectsFromArray:[self.mediaShadowView2 autoPinToEdgesOfView:bodyProxyView]]; + [self.viewConstraints addObjectsFromArray:[self.mediaClipView autoPinToEdgesOfView:bodyProxyView]]; [self.mediaClipView addSubview:bodyMediaView]; - [bodyMediaView autoPinToSuperviewEdges]; + [self.viewConstraints addObjectsFromArray:[bodyMediaView autoPinToSuperviewEdges]]; + [self.bubbleView addPartnerView:self.mediaShadowView1]; + [self.bubbleView addPartnerView:self.mediaShadowView2]; [self.bubbleView addPartnerView:self.mediaClipView]; - [self.bubbleView addPartnerView:self.mediaShadowView]; - - // TODO: Constants - // TODO: What's the difference between an inner and outer shadow? - self.mediaShadowView.fillColor = self.bubbleColor; - self.mediaShadowView.layer.shadowColor = [UIColor blackColor].CGColor; - self.mediaShadowView.layer.shadowOpacity = 0.12f; - self.mediaShadowView.layer.shadowOffset = CGSizeMake(0.f, 0.f); - self.mediaShadowView.layer.shadowRadius = 0.5f; + + // TODO: Consider only using a single shadow for perf. + self.mediaShadowView1.fillColor = self.bubbleColor; + self.mediaShadowView1.layer.shadowColor = [UIColor blackColor].CGColor; + self.mediaShadowView1.layer.shadowOpacity = 0.2f; + self.mediaShadowView1.layer.shadowOffset = CGSizeMake(0.f, 4.f); + self.mediaShadowView1.layer.shadowRadius = 20.f; + + self.mediaShadowView2.fillColor = self.bubbleColor; + self.mediaShadowView2.layer.shadowColor = [UIColor blackColor].CGColor; + self.mediaShadowView2.layer.shadowOpacity = 0.08f; + self.mediaShadowView2.layer.shadowOffset = CGSizeZero; + self.mediaShadowView2.layer.shadowRadius = 4.f; } else { OWSAssert(self.cellType == OWSMessageCellType_ContactShare); @@ -379,7 +388,7 @@ NS_ASSUME_NONNULL_BEGIN self.bubbleStrokeView.strokeColor = [UIColor lightGrayColor]; self.bubbleStrokeView.strokeThickness = 1.f; [self.bubbleView addSubview:self.bubbleStrokeView]; - [self.bubbleStrokeView autoPinToSuperviewEdges]; + [self.viewConstraints addObjectsFromArray:[self.bubbleStrokeView autoPinToSuperviewEdges]]; [self.bubbleView addPartnerView:self.bubbleStrokeView]; } } else { @@ -1235,7 +1244,8 @@ NS_ASSUME_NONNULL_BEGIN [self.quotedMessageView removeFromSuperview]; self.quotedMessageView = nil; - [self.mediaShadowView removeFromSuperview]; + [self.mediaShadowView1 removeFromSuperview]; + [self.mediaShadowView2 removeFromSuperview]; [self.mediaClipView removeFromSuperview]; [self.footerView removeFromSuperview]; diff --git a/SignalMessaging/categories/UIView+OWS.h b/SignalMessaging/categories/UIView+OWS.h index 1ec316b46..68829583a 100644 --- a/SignalMessaging/categories/UIView+OWS.h +++ b/SignalMessaging/categories/UIView+OWS.h @@ -106,6 +106,8 @@ CGFloat ScaleFromIPhone5(CGFloat iPhone5Value); // When using a UIView as a "div" to structure layout, we don't want it to have margins. - (void)setHLayoutMargins:(CGFloat)value; +- (NSArray *)autoPinToEdgesOfView:(UIView *)view; + #pragma mark - Containers + (UIView *)containerView; diff --git a/SignalMessaging/categories/UIView+OWS.m b/SignalMessaging/categories/UIView+OWS.m index d99cadd3a..63e796c01 100644 --- a/SignalMessaging/categories/UIView+OWS.m +++ b/SignalMessaging/categories/UIView+OWS.m @@ -402,6 +402,18 @@ CGFloat ScaleFromIPhone5(CGFloat iPhone5Value) self.layoutMargins = layoutMargins; } +- (NSArray *)autoPinToEdgesOfView:(UIView *)view +{ + OWSAssert(view); + + return @[ + [self autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:view], + [self autoPinEdge:ALEdgeBottom toEdge:ALEdgeBottom ofView:view], + [self autoPinEdge:ALEdgeLeading toEdge:ALEdgeLeading ofView:view], + [self autoPinEdge:ALEdgeTrailing toEdge:ALEdgeTrailing ofView:view], + ]; +} + #pragma mark - Containers + (UIView *)containerView