From 2ccfd5ffdbc697feffc9c1449c5099ad42886ed7 Mon Sep 17 00:00:00 2001 From: Kyle Fang Date: Thu, 25 Jul 2013 23:00:01 +0800 Subject: [PATCH] Added Copy and fixed paste bug. Added selected state for BubbleView. may need a little work on the artwork. --- .../JSBubbleMessageCell.m | 4 ++- JSMessagesTableViewController/JSBubbleView.h | 5 +++- JSMessagesTableViewController/JSBubbleView.m | 28 +++++++++++++++--- .../JSMessagesViewController.m | 4 ++- .../Images/messageBubbleSelected.png | Bin 0 -> 2366 bytes .../Images/messageBubbleSelected@2x.png | Bin 0 -> 4738 bytes MessagesDemo.xcodeproj/project.pbxproj | 8 +++++ 7 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 JSMessagesTableViewController/Resources/Images/messageBubbleSelected.png create mode 100644 JSMessagesTableViewController/Resources/Images/messageBubbleSelected@2x.png diff --git a/JSMessagesTableViewController/JSBubbleMessageCell.m b/JSMessagesTableViewController/JSBubbleMessageCell.m index 3f7d998..a12e059 100644 --- a/JSMessagesTableViewController/JSBubbleMessageCell.m +++ b/JSMessagesTableViewController/JSBubbleMessageCell.m @@ -177,7 +177,7 @@ return; UIMenuController *menu = [UIMenuController sharedMenuController]; - [menu setTargetRect:self.bubbleView.frame inView:self]; + [menu setTargetRect:CGRectInset([self.bubbleView bubbleFrame], 0, 4.f) inView:self]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuWillShow:) @@ -201,6 +201,7 @@ - (void) menuWillHide:(NSNotification *)notification { [[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerWillHideMenuNotification object:nil]; + self.bubbleView.selectedToShowCopyMenu = NO; } - (void) menuWillShow:(NSNotification *)notification @@ -210,6 +211,7 @@ selector:@selector(menuWillHide:) name:UIMenuControllerWillHideMenuNotification object:nil]; + self.bubbleView.selectedToShowCopyMenu = YES; } - (void)dealloc{ diff --git a/JSMessagesTableViewController/JSBubbleView.h b/JSMessagesTableViewController/JSBubbleView.h index fd00943..d42c833 100644 --- a/JSMessagesTableViewController/JSBubbleView.h +++ b/JSMessagesTableViewController/JSBubbleView.h @@ -40,7 +40,7 @@ typedef enum { JSBubbleMessageStyleIncomingSquare, JSBubbleMessageStyleOutgoingDefault, JSBubbleMessageStyleOutgoingDefaultGreen, - JSBubbleMessageStyleOutgoingSquare + JSBubbleMessageStyleOutgoingSquare, } JSBubbleMessageStyle; @@ -53,6 +53,9 @@ typedef enum { #pragma mark - Initialization - (id)initWithFrame:(CGRect)frame bubbleStyle:(JSBubbleMessageStyle)bubbleStyle; +- (CGRect)bubbleFrame; +@property (nonatomic) BOOL selectedToShowCopyMenu; + #pragma mark - Bubble view + (UIImage *)bubbleImageForStyle:(JSBubbleMessageStyle)style; + (UIFont *)font; diff --git a/JSMessagesTableViewController/JSBubbleView.m b/JSMessagesTableViewController/JSBubbleView.m index 1446436..5feb655 100644 --- a/JSMessagesTableViewController/JSBubbleView.m +++ b/JSMessagesTableViewController/JSBubbleView.m @@ -86,16 +86,36 @@ [self setNeedsDisplay]; } +- (void)setSelectedToShowCopyMenu:(BOOL)selectedToShowCopyMenu{ + _selectedToShowCopyMenu = selectedToShowCopyMenu; + [self setNeedsDisplay]; +} + #pragma mark - Drawing -- (void)drawRect:(CGRect)frame -{ - UIImage *image = [JSBubbleView bubbleImageForStyle:self.style]; + +- (CGRect)bubbleFrame{ CGSize bubbleSize = [JSBubbleView bubbleSizeForText:self.text]; CGRect bubbleFrame = CGRectMake(([self styleIsOutgoing] ? self.frame.size.width - bubbleSize.width : 0.0f), kMarginTop, bubbleSize.width, bubbleSize.height); - + return bubbleFrame; +} + +- (void)drawRect:(CGRect)frame +{ + UIImage *image = nil; + if (self.selectedToShowCopyMenu) { + if ([self styleIsOutgoing]) { + image = [[UIImage imageNamed:@"messageBubbleHighlighted"] stretchableImageWithLeftCapWidth:15 topCapHeight:15]; + } else { + image = [[UIImage imageNamed:@"messageBubbleSelected"] stretchableImageWithLeftCapWidth:23 topCapHeight:15]; + } + } else { + image = [JSBubbleView bubbleImageForStyle:self.style]; + } + [JSBubbleView bubbleImageForStyle:self.style]; + CGRect bubbleFrame = [self bubbleFrame]; [image drawInRect:bubbleFrame]; CGSize textSize = [JSBubbleView textSizeForText:self.text]; diff --git a/JSMessagesTableViewController/JSMessagesViewController.m b/JSMessagesTableViewController/JSMessagesViewController.m index 4cde8a3..63c328c 100644 --- a/JSMessagesTableViewController/JSMessagesViewController.m +++ b/JSMessagesTableViewController/JSMessagesViewController.m @@ -271,7 +271,9 @@ BOOL isShrinking = textViewContentHeight < self.previousTextViewContentHeight; CGFloat changeInHeight = textViewContentHeight - self.previousTextViewContentHeight; - changeInHeight = (textViewContentHeight + changeInHeight >= maxHeight) ? 0.0f : changeInHeight; + if (changeInHeight > 0 && self.previousTextViewContentHeight == maxHeight) { + changeInHeight = 0; + } if(!isShrinking) [self.inputToolBarView adjustTextViewHeightBy:changeInHeight]; diff --git a/JSMessagesTableViewController/Resources/Images/messageBubbleSelected.png b/JSMessagesTableViewController/Resources/Images/messageBubbleSelected.png new file mode 100644 index 0000000000000000000000000000000000000000..13c9962fcc326370052dcbabec83ec13c992f7a7 GIT binary patch literal 2366 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