ChatCustomCell .h 自定义的cell类。
ChatViewController.h 主视图控制器
FaceViewController.h 表情试图控制器
AsyncUdpSocket.h Socket类
ChatViewController.h 主视图控制器
//监听键盘高度的变换
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
// 键盘高度变化通知,ios5.0新增的
#ifdef __IPHONE_5_0
float version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (version >= 5.0) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillChangeFrameNotification object:nil];
}
#endif
- (void)keyboardWillShow:(NSNotification *)notification {
/*
Reduce the size of the text view so that it's not obscured by the keyboard.
Animate the resize so that it's in sync with the appearance of the keyboard.
*/
NSDictionary *userInfo = [notification userInfo];
// Get the origin of the keyboard when it's displayed.
NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
// Get the top of the keyboard as the y coordinate of its origin in self's view's coordinate system. The bottom of the text view's frame should align with the top of the keyboard's final position.
CGRect keyboardRect = [aValue CGRectValue];
// Get the duration of the animation.
NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
NSTimeInterval animationDuration;
[animationDurationValue getValue:&animationDuration];
// Animate the resize of the text view's frame in sync with the keyboard's appearance.
[self autoMovekeyBoard:keyboardRect.size.height];
}
- (void)keyboardWillHide:(NSNotification *)notification {
NSDictionary* userInfo = [notification userInfo];
/*
Restore the size of the text view (fill self's view).
Animate the resize so that it's in sync with the disappearance of the keyboard.
*/
NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
NSTimeInterval animationDuration;
[animationDurationValue getValue:&animationDuration];
[self autoMovekeyBoard:0];
}
-(void) autoMovekeyBoard: (float) h{
UIToolbar *toolbar = (UIToolbar *)[self.view viewWithTag:TOOLBARTAG];
toolbar.frame = CGRectMake(0.0f, (float)(480.0-h-108.0), 320.0f, 44.0f);
UITableView *tableView = (UITableView *)[self.view viewWithTag:TABLEVIEWTAG];
tableView.frame = CGRectMake(0.0f, 0.0f, 320.0f,(float)(480.0-h-108.0));
}
发送消息:
1. 首先将发送的消息转化为NSData利用Socket发出去。
2.根据发送的内容返回个UIView(显示着聊天的内容),封装成个字典
UIView *chatView = [self bubbleView:[NSString stringWithFormat:@"%@:%@", NSLocalizedString(@"me",nil), message]
from:YES];
[self.chatArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:message, @"text", @"self", @"speaker", chatView, @"view", nil]];
- (UIView *)bubbleView:(NSString *)text from:(BOOL)fromSelf {
// build single chat bubble cell with given text
UIView *returnView = [self assembleMessageAtIndex:text from:fromSelf];
returnView.backgroundColor = [UIColor redColor];
UIView *cellView = [[UIView alloc] initWithFrame:CGRectZero];
cellView.backgroundColor = [UIColor purpleColor];
UIImage *bubble = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fromSelf?@"bubbleSelf":@"bubble" ofType:@"png"]];
UIImageView *bubbleImageView = [[UIImageView alloc] initWithImage:[bubble stretchableImageWithLeftCapWidth:20 topCapHeight:14]];
UIImageView *headImageView = [[UIImageView alloc] init];
if(fromSelf){
[headImageView setImage:[UIImage imageNamed:@"face_test.png"]];
returnView.frame= CGRectMake(9.0f, 15.0f, returnView.frame.size.width, returnView.frame.size.height);
bubbleImageView.frame = CGRectMake(0.0f, 14.0f, returnView.frame.size.width+24.0f, returnView.frame.size.height+24.0f );
cellView.frame = CGRectMake(265.0f-bubbleImageView.frame.size.width, 0.0f,bubbleImageView.frame.size.width+50.0f, bubbleImageView.frame.size.height+30.0f);
headImageView.frame = CGRectMake(bubbleImageView.frame.size.width, cellView.frame.size.height-50.0f, 50.0f, 50.0f);
}
else{
[headImageView setImage:[UIImage imageNamed:@"default_head_online.png"]];
returnView.frame= CGRectMake(65.0f, 15.0f, returnView.frame.size.width, returnView.frame.size.height);
bubbleImageView.frame = CGRectMake(50.0f, 14.0f, returnView.frame.size.width+24.0f, returnView.frame.size.height+24.0f);
cellView.frame = CGRectMake(0.0f, 0.0f, bubbleImageView.frame.size.width+30.0f,bubbleImageView.frame.size.height+30.0f);
headImageView.frame = CGRectMake(0.0f, cellView.frame.size.height-50.0f, 50.0f, 50.0f);
}
[cellView addSubview:bubbleImageView];
[cellView addSubview:headImageView];
[cellView addSubview:returnView];
[bubbleImageView release];
[returnView release];
[headImageView release];
return [cellView autorelease];
}
#define KFacialSizeWidth 18
#define KFacialSizeHeight 18
#define MAX_WIDTH 150
-(UIView *)assembleMessageAtIndex : (NSString *) message from:(BOOL)fromself
{
NSMutableArray *array = [[NSMutableArray alloc] init];
[self getImageRange:message :array];
UIView *returnView = [[UIView alloc] initWithFrame:CGRectZero];
NSArray *data = array;
UIFont *fon = [UIFont systemFontOfSize:13.0f];
CGFloat upX = 0;
CGFloat upY = 0;
CGFloat X = 0;
CGFloat Y = 0;
if (data) {
for (int i=0;i < [data count];i++) {
NSString *str=[data objectAtIndex:i];
NSLog(@"str--->%@",str);
if ([str hasPrefix: BEGIN_FLAG] && [str hasSuffix: END_FLAG])
{
if (upX >= MAX_WIDTH)
{
upY = upY + KFacialSizeHeight;
upX = 0;
X = 150;
Y = upY;
}
NSLog(@"str(image)---->%@",str);
NSString *imageName=[str substringWithRange:NSMakeRange(2, str.length - 3)];
UIImageView *img=[[UIImageView alloc]initWithImage:[UIImage imageNamed:imageName]];
img.frame = CGRectMake(upX, upY, KFacialSizeWidth, KFacialSizeHeight);
[returnView addSubview:img];
[img release];
upX=KFacialSizeWidth+upX;
if (X<150) X = upX;
} else {
for (int j = 0; j < [str length]; j++) {
NSString *temp = [str substringWithRange:NSMakeRange(j, 1)];
if (upX >= MAX_WIDTH)
{
upY = upY + KFacialSizeHeight;
upX = 0;
X = 150;
Y =upY;
}
CGSize size=[temp sizeWithFont:fon constrainedToSize:CGSizeMake(150, 40)];
UILabel *la = [[UILabel alloc] initWithFrame:CGRectMake(upX,upY,size.width,size.height)];
la.font = fon;
la.text = temp;
la.backgroundColor = [UIColor clearColor];
[returnView addSubview:la];
[la release];
upX=upX+size.width;
if (X<150) {
X = upX;
}
}
}
}
}
returnView.frame = CGRectMake(15.0f,1.0f, X, Y); //@ 需要将该view的尺寸记下,方便以后使用
NSLog(@"%.1f %.1f", X, Y);
return returnView;
}
- (UIView *)bubbleView:(NSString *)text from:(BOOL)fromSelf {
// build single chat bubble cell with given text
UIView *returnView = [self assembleMessageAtIndex:text from:fromSelf];
returnView.backgroundColor = [UIColor redColor];
UIView *cellView = [[UIView alloc] initWithFrame:CGRectZero];
cellView.backgroundColor = [UIColor purpleColor];
UIImage *bubble = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fromSelf?@"bubbleSelf":@"bubble" ofType:@"png"]];
UIImageView *bubbleImageView = [[UIImageView alloc] initWithImage:[bubble stretchableImageWithLeftCapWidth:20 topCapHeight:14]];
UIImageView *headImageView = [[UIImageView alloc] init];
if(fromSelf){
[headImageView setImage:[UIImage imageNamed:@"face_test.png"]];
returnView.frame= CGRectMake(9.0f, 15.0f, returnView.frame.size.width, returnView.frame.size.height);
bubbleImageView.frame = CGRectMake(0.0f, 14.0f, returnView.frame.size.width+24.0f, returnView.frame.size.height+24.0f );
cellView.frame = CGRectMake(265.0f-bubbleImageView.frame.size.width, 0.0f,bubbleImageView.frame.size.width+50.0f, bubbleImageView.frame.size.height+30.0f);
headImageView.frame = CGRectMake(bubbleImageView.frame.size.width, cellView.frame.size.height-50.0f, 50.0f, 50.0f);
}
else{
[headImageView setImage:[UIImage imageNamed:@"default_head_online.png"]];
returnView.frame= CGRectMake(65.0f, 15.0f, returnView.frame.size.width, returnView.frame.size.height);
bubbleImageView.frame = CGRectMake(50.0f, 14.0f, returnView.frame.size.width+24.0f, returnView.frame.size.height+24.0f);
cellView.frame = CGRectMake(0.0f, 0.0f, bubbleImageView.frame.size.width+30.0f,bubbleImageView.frame.size.height+30.0f);
headImageView.frame = CGRectMake(0.0f, cellView.frame.size.height-50.0f, 50.0f, 50.0f);
}
[cellView addSubview:bubbleImageView];
[cellView addSubview:headImageView];
[cellView addSubview:returnView];
[bubbleImageView release];
[returnView release];
[headImageView release];
return [cellView autorelease];
}
3.在tableview中显示。
1.每个表情是一个字典,value是Image,key是文件名。
2.然后把每个表情存放在数组中方便取。
3.最后将表情放在scrollview上