remove button category. implement iOS 7 send button, first draft. update docs and demo.

This commit is contained in:
Jesse Squires 2013-11-18 19:08:51 -08:00
parent 708c21f7a3
commit d58dfe7c7b
7 changed files with 93 additions and 111 deletions

View File

@ -23,8 +23,6 @@
88A3FB82182E0B1700705327 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88A3FB81182E0B1700705327 /* AudioToolbox.framework */; };
88A3FC59182E0EA000705327 /* NSString+JSMessagesView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A3FC1D182E0EA000705327 /* NSString+JSMessagesView.m */; };
88A3FC5A182E0EA000705327 /* NSString+JSMessagesView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A3FC1D182E0EA000705327 /* NSString+JSMessagesView.m */; };
88A3FC5B182E0EA000705327 /* UIButton+JSMessagesView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A3FC1F182E0EA000705327 /* UIButton+JSMessagesView.m */; };
88A3FC5C182E0EA000705327 /* UIButton+JSMessagesView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A3FC1F182E0EA000705327 /* UIButton+JSMessagesView.m */; };
88A3FC5D182E0EA000705327 /* UIColor+JSMessagesView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A3FC21182E0EA000705327 /* UIColor+JSMessagesView.m */; };
88A3FC5E182E0EA000705327 /* UIColor+JSMessagesView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A3FC21182E0EA000705327 /* UIColor+JSMessagesView.m */; };
88A3FC61182E0EA000705327 /* UIImage+JSMessagesView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A3FC25182E0EA000705327 /* UIImage+JSMessagesView.m */; };
@ -142,8 +140,6 @@
88A3FC15182E0B8C00705327 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = text; path = README.md; sourceTree = "<group>"; };
88A3FC1C182E0EA000705327 /* NSString+JSMessagesView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+JSMessagesView.h"; sourceTree = "<group>"; };
88A3FC1D182E0EA000705327 /* NSString+JSMessagesView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+JSMessagesView.m"; sourceTree = "<group>"; };
88A3FC1E182E0EA000705327 /* UIButton+JSMessagesView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+JSMessagesView.h"; sourceTree = "<group>"; };
88A3FC1F182E0EA000705327 /* UIButton+JSMessagesView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+JSMessagesView.m"; sourceTree = "<group>"; };
88A3FC20182E0EA000705327 /* UIColor+JSMessagesView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+JSMessagesView.h"; sourceTree = "<group>"; };
88A3FC21182E0EA000705327 /* UIColor+JSMessagesView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+JSMessagesView.m"; sourceTree = "<group>"; };
88A3FC24182E0EA000705327 /* UIImage+JSMessagesView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+JSMessagesView.h"; sourceTree = "<group>"; };
@ -351,8 +347,6 @@
children = (
88A3FC1C182E0EA000705327 /* NSString+JSMessagesView.h */,
88A3FC1D182E0EA000705327 /* NSString+JSMessagesView.m */,
88A3FC1E182E0EA000705327 /* UIButton+JSMessagesView.h */,
88A3FC1F182E0EA000705327 /* UIButton+JSMessagesView.m */,
88A3FC20182E0EA000705327 /* UIColor+JSMessagesView.h */,
88A3FC21182E0EA000705327 /* UIColor+JSMessagesView.m */,
88A3FC24182E0EA000705327 /* UIImage+JSMessagesView.h */,
@ -656,7 +650,6 @@
88A3FB5A182E079E00705327 /* JSAppDelegate.m in Sources */,
88A3FC65182E0EA000705327 /* JSBubbleImageViewFactory.m in Sources */,
88A3FC59182E0EA000705327 /* NSString+JSMessagesView.m in Sources */,
88A3FC5B182E0EA000705327 /* UIButton+JSMessagesView.m in Sources */,
88A3FC61182E0EA000705327 /* UIImage+JSMessagesView.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -665,7 +658,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
88A3FC5C182E0EA000705327 /* UIButton+JSMessagesView.m in Sources */,
88A3FC68182E0EA000705327 /* JSBubbleMessageCell.m in Sources */,
88A3FB78182E079E00705327 /* JSMessagesDemoTests.m in Sources */,
88A3FC5A182E0EA000705327 /* NSString+JSMessagesView.m in Sources */,

View File

@ -14,7 +14,6 @@
#import "JSDemoViewController.h"
#import "UIButton+JSMessagesView.h"
#import "JSAvatarImageFactory.h"
#define kSubtitleJobs @"Jobs"
@ -158,10 +157,8 @@
//
// The button's frame is set automatically for you
//
- (UIButton *)sendButtonForInputView
{
return [UIButton js_defaultSendButton_iOS6];
}
// - (UIButton *)sendButtonForInputView
//
// *** Implement to prevent auto-scrolling when message is added
//

View File

@ -1,21 +0,0 @@
//
// Created by Jesse Squires
// http://www.hexedbits.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSMessagesViewController
//
//
// The MIT License
// Copyright (c) 2013 Jesse Squires
// http://opensource.org/licenses/MIT
//
#import <UIKit/UIKit.h>
@interface UIButton (JSMessagesView)
+ (UIButton *)js_defaultSendButton_iOS6;
@end

View File

@ -1,49 +0,0 @@
//
// Created by Jesse Squires
// http://www.hexedbits.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSMessagesViewController
//
//
// The MIT License
// Copyright (c) 2013 Jesse Squires
// http://opensource.org/licenses/MIT
//
#import "UIButton+JSMessagesView.h"
@implementation UIButton (JSMessagesView)
+ (UIButton *)js_defaultSendButton_iOS6
{
UIButton *sendButton = [UIButton buttonWithType:UIButtonTypeCustom];
sendButton.autoresizingMask = (UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin);
UIEdgeInsets insets = UIEdgeInsetsMake(0.0f, 13.0f, 0.0f, 13.0f);
UIImage *sendBack = [[UIImage imageNamed:@"send-button"] resizableImageWithCapInsets:insets];
UIImage *sendBackHighLighted = [[UIImage imageNamed:@"send-button-pressed"] resizableImageWithCapInsets:insets];
[sendButton setBackgroundImage:sendBack forState:UIControlStateNormal];
[sendButton setBackgroundImage:sendBack forState:UIControlStateDisabled];
[sendButton setBackgroundImage:sendBackHighLighted forState:UIControlStateHighlighted];
NSString *title = NSLocalizedString(@"Send", nil);
[sendButton setTitle:title forState:UIControlStateNormal];
[sendButton setTitle:title forState:UIControlStateHighlighted];
[sendButton setTitle:title forState:UIControlStateDisabled];
sendButton.titleLabel.font = [UIFont boldSystemFontOfSize:16.0f];
UIColor *titleShadow = [UIColor colorWithRed:0.325f green:0.463f blue:0.675f alpha:1.0f];
[sendButton setTitleShadowColor:titleShadow forState:UIControlStateNormal];
[sendButton setTitleShadowColor:titleShadow forState:UIControlStateHighlighted];
sendButton.titleLabel.shadowOffset = CGSizeMake(0.0f, -1.0f);
[sendButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[sendButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
[sendButton setTitleColor:[UIColor colorWithWhite:1.0f alpha:0.5f] forState:UIControlStateDisabled];
return sendButton;
}
@end

View File

@ -35,13 +35,20 @@ typedef NS_ENUM(NSUInteger, JSMessageInputViewStyle) {
*/
@interface JSMessageInputView : UIImageView
/**
* Returns the style appearance for the input view.
* @see JSMessageInputViewStyle.
*/
@property (assign, nonatomic, readonly) JSMessageInputViewStyle style;
/**
* Returns the textView into which a new message is composed. This property is never `nil`.
*/
@property (weak, nonatomic, readonly) JSMessageTextView *textView;
/**
* The send button for the input view. The default value is `nil`.
* The send button for the input view. The default value is an initialized `UIButton` whose appearance is styled according to the value of style during initialization.
@see JSMessageInputViewStyle.
*/
@property (weak, nonatomic) UIButton *sendButton;
@ -52,7 +59,8 @@ typedef NS_ENUM(NSUInteger, JSMessageInputViewStyle) {
*
* @param frame A rectangle specifying the initial location and size of the bubble view in its superview's coordinates.
* @param style The style of the input view. @see JSMessageInputViewStyle.
* @param delegate An object that conforms to the `UITextViewDelegate` protocol and `JSDismissiveTextViewDelegate` protocol. @see JSDismissiveTextViewDelegate.
* @param delegate An object that conforms to the `UITextViewDelegate` protocol and `JSDismissiveTextViewDelegate` protocol.
* @see JSDismissiveTextViewDelegate.
* @param panGestureRecognizer A `UIPanGestureRecognizer` used to dismiss the input view by dragging down.
*
* @return An initialized `JSMessageInputView` object or `nil` if the object could not be successfully initialized.

View File

@ -21,7 +21,8 @@
@interface JSMessageInputView ()
- (void)setup;
- (void)configureWithStyle:(JSMessageInputViewStyle)style;
- (void)configureInputBarWithStyle:(JSMessageInputViewStyle)style;
- (void)configureSendButtonWithStyle:(JSMessageInputViewStyle)style;
@end
@ -39,7 +40,7 @@
self.userInteractionEnabled = YES;
}
- (void)configureWithStyle:(JSMessageInputViewStyle)style
- (void)configureInputBarWithStyle:(JSMessageInputViewStyle)style
{
CGFloat width = self.frame.size.width - SEND_BUTTON_WIDTH;
CGFloat height = [JSMessageInputView textViewLineHeight];
@ -48,17 +49,7 @@
[self addSubview:textView];
_textView = textView;
if(style == JSMessageInputViewStyleFlat) {
_textView.frame = CGRectMake(4.0f, 4.5f, width, height);
_textView.backgroundColor = [UIColor clearColor];
_textView.layer.borderColor = [UIColor colorWithWhite:0.8f alpha:1.0f].CGColor;
_textView.layer.borderWidth = 0.65f;
_textView.layer.cornerRadius = 6.0f;
self.image = [[UIImage imageNamed:@"input-bar-flat"] resizableImageWithCapInsets:UIEdgeInsetsZero
resizingMode:UIImageResizingModeStretch];
}
else if(style == JSMessageInputViewStyleClassic) {
if(style == JSMessageInputViewStyleClassic) {
_textView.frame = CGRectMake(6.0f, 3.0f, width, height);
_textView.backgroundColor = [UIColor whiteColor];
@ -74,6 +65,61 @@
inputFieldBack.backgroundColor = [UIColor clearColor];
[self addSubview:inputFieldBack];
}
else {
_textView.frame = CGRectMake(4.0f, 4.5f, width, height);
_textView.backgroundColor = [UIColor clearColor];
_textView.layer.borderColor = [UIColor colorWithWhite:0.8f alpha:1.0f].CGColor;
_textView.layer.borderWidth = 0.65f;
_textView.layer.cornerRadius = 6.0f;
self.image = [[UIImage imageNamed:@"input-bar-flat"] resizableImageWithCapInsets:UIEdgeInsetsMake(2.0f, 0.0f, 0.0f, 0.0f)
resizingMode:UIImageResizingModeStretch];
}
}
- (void)configureSendButtonWithStyle:(JSMessageInputViewStyle)style
{
UIButton *sendButton;
if(style == JSMessageInputViewStyleClassic) {
UIButton *sendButton = [UIButton buttonWithType:UIButtonTypeCustom];
sendButton.autoresizingMask = (UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin);
UIEdgeInsets insets = UIEdgeInsetsMake(0.0f, 13.0f, 0.0f, 13.0f);
UIImage *sendBack = [[UIImage imageNamed:@"send-button"] resizableImageWithCapInsets:insets];
UIImage *sendBackHighLighted = [[UIImage imageNamed:@"send-button-pressed"] resizableImageWithCapInsets:insets];
[sendButton setBackgroundImage:sendBack forState:UIControlStateNormal];
[sendButton setBackgroundImage:sendBack forState:UIControlStateDisabled];
[sendButton setBackgroundImage:sendBackHighLighted forState:UIControlStateHighlighted];
UIColor *titleShadow = [UIColor colorWithRed:0.325f green:0.463f blue:0.675f alpha:1.0f];
[sendButton setTitleShadowColor:titleShadow forState:UIControlStateNormal];
[sendButton setTitleShadowColor:titleShadow forState:UIControlStateHighlighted];
sendButton.titleLabel.shadowOffset = CGSizeMake(0.0f, -1.0f);
[sendButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[sendButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
[sendButton setTitleColor:[UIColor colorWithWhite:1.0f alpha:0.5f] forState:UIControlStateDisabled];
sendButton.titleLabel.font = [UIFont boldSystemFontOfSize:16.0f];
}
else {
sendButton = [UIButton buttonWithType:UIButtonTypeCustom];
sendButton.backgroundColor = [UIColor clearColor];
[sendButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[sendButton setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];
[sendButton setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled];
sendButton.titleLabel.font = [UIFont boldSystemFontOfSize:18.0f];
}
NSString *title = NSLocalizedString(@"Send", nil);
[sendButton setTitle:title forState:UIControlStateNormal];
[sendButton setTitle:title forState:UIControlStateHighlighted];
[sendButton setTitle:title forState:UIControlStateDisabled];
[self setSendButton:sendButton];
}
- (instancetype)initWithFrame:(CGRect)frame
@ -83,8 +129,11 @@
{
self = [super initWithFrame:frame];
if(self) {
_style = style;
[self setup];
[self configureWithStyle:style];
[self configureInputBarWithStyle:style];
[self configureSendButtonWithStyle:style];
_textView.delegate = delegate;
_textView.keyboardDelegate = delegate;
_textView.dismissivePanGestureRecognizer = panGestureRecognizer;
@ -113,6 +162,17 @@
if(_sendButton)
[_sendButton removeFromSuperview];
if(self.style == JSMessageInputViewStyleClassic) {
btn.frame = CGRectMake(self.frame.size.width - 65.0f, 8.0f, 59.0f, 26.0f);
}
else {
CGFloat padding = 8.0f;
btn.frame = CGRectMake(self.textView.frame.origin.x + self.textView.frame.size.width + padding,
padding,
60.0f,
self.textView.frame.size.height - padding);
}
[self addSubview:btn];
_sendButton = btn;
}

View File

@ -17,7 +17,6 @@
#import "NSString+JSMessagesView.h"
#import "UIColor+JSMessagesView.h"
#import "UIButton+JSMessagesView.h"
@interface JSMessagesViewController () <JSDismissiveTextViewDelegate>
@ -85,19 +84,15 @@
delegate:self
panGestureRecognizer:_tableView.panGestureRecognizer];
UIButton *sendButton;
if([self.delegate respondsToSelector:@selector(sendButtonForInputView)]) {
sendButton = [self.delegate sendButtonForInputView];
UIButton *sendButton = [self.delegate sendButtonForInputView];
[inputView setSendButton:sendButton];
}
else {
sendButton = [UIButton js_defaultSendButton_iOS6];
}
sendButton.enabled = NO;
sendButton.frame = CGRectMake(inputView.frame.size.width - 65.0f, 8.0f, 59.0f, 26.0f);
[sendButton addTarget:self
action:@selector(sendPressed:)
forControlEvents:UIControlEventTouchUpInside];
[inputView setSendButton:sendButton];
inputView.sendButton.enabled = NO;
[inputView.sendButton addTarget:self
action:@selector(sendPressed:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:inputView];
_messageInputView = inputView;