气泡聊天

import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate,UITextFieldDelegate>
{
    //用盛放说话的内容
    NSMutableArray *_dataArray;
    //底部的视图
    UIView *_bottomView;
    //输入框
    UITextField *_textField;
    //判断是谁说
    BOOL _who;
}
@property (retain, nonatomic) IBOutlet UITableView *tableView;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    _dataArray = [[NSMutableArray alloc] init];
    [self createBottomView];
    //separatorStyle 设置cell分割线的样式
    _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    //UIScrollViewKeyboardDismissModeOnDrag 当拖动的时候让键盘隐藏
    _tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
}

#pragma mark - 创建底部的视图
- (void)createBottomView
{
    //背景图,输入框,按钮 都放在一个view之上,当键盘弹出的时候,改变view的frame即可
    //创建一个视图
    _bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 480-44, 320, 44)];
    [self.view addSubview:_bottomView];
    //添加背景图
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    imgView.image = [UIImage imageNamed:@"bg"];
    [_bottomView addSubview:imgView];
    [imgView release];
    //添加输入框
    _textField = [[UITextField alloc] initWithFrame:CGRectMake(7, 7, 253, 30)];
    _textField.borderStyle = UITextBorderStyleRoundedRect;
    //设置输入框的代理
    _textField.delegate = self;
    [_bottomView addSubview:_textField];
    //添加发送按钮
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
    btn.frame = CGRectMake(260, 0, 60, 44);
    [btn setTitle:@"发送" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(sendMessage) forControlEvents:UIControlEventTouchUpInside];
    [_bottomView addSubview:btn];
}

#pragma mark - 发送按钮点击方法
- (void)sendMessage
{
    if ([_textField.text isEqualToString:@""])
    {
        //当内容为空的时候,不发送
        return;
    }
    //说的内容:谁、时间、说的话都在一个视图之上,当你需要显示内容的时候,让cell  addSubview
    //当是YES:我,当是NO:静静
    _who = !_who;
    //1.获取由谁说
    //如果条件为真,执行结果1;如果条件为假,执行结果2
    //三目运算符    条件?结果1:结果2
    NSString *name = _who?@"我":@"静静";
    
    //2.获取说的时间
    //获取当前时间
    NSDate *date = [NSDate date];
    //时间格式化器
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    //设置时间格式
    formatter.dateFormat = @"MM-dd HH:mm:ss";
    //把时间转化成字符串
    NSString *time = [formatter stringFromDate:date];

    //3.拼接所说的内容
    NSString *message = [NSString stringWithFormat:@"%@在%@说:\n %@",name,time,_textField.text];

    //4.获取盛放内容的视图
    UIView *view = [self createViewWithMessage:message];
    [_dataArray addObject:view];

    //5.刷新表
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_dataArray.count-1 inSection:0];
    [_tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    //当有新消息时,显示最后一行
    //根据表的索引,移动到指定的位置
    //atScrollPosition 要移动的位置
    //UITableViewScrollPositionBottom 移动到底部
    [_tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

    //清空输入框的内容
    _textField.text = @"";
}
//根据说的内容创建视图
- (UIView *)createViewWithMessage:(NSString *)message
{
    //获取文字内容宽高
    //参数1.文字的宽度200 和 高LONG_MAX
    //2.NSStringDrawingUsesLineFragmentOrigin根据行高计算文字的高度
    //3.attributes 文字的大小,和lab保持一致
    CGRect rect = [message boundingRectWithSize:CGSizeMake(200, LONG_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14]} context:nil];

    //获取文字的高度
    float height = rect.size.height;
    float width = rect.size.width;
    //根据谁谁判断x坐标
    float x = _who?self.view.frame.size.width-width-30:0;
    //1.创建view
    UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(x, 0, width+30, height+30)] autorelease];
    view.tag = 10;

    //2.添加气泡
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, width+20, height+20)];
    //根据谁说获取图片名字
    NSString *imgName = _who?@"bubbleSelf":@"bubble";
    UIImage *img = [UIImage imageNamed:imgName];
    //stretchableImage拉伸图片
    //LeftCapWidth距左边多少开始拉伸
    //topCapHeight距上面多少开始拉伸
    //img.size.width 获取图片的宽
    imgView.image = [img stretchableImageWithLeftCapWidth:img.size.width*0.5 topCapHeight:img.size.height*0.5];
    [view addSubview:imgView];
    [imgView release];

    //3.添加lab显示文字
    UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(15, 15, width, height)];
    //要比显示文字大小小一点
    lab.font = [UIFont systemFontOfSize:13];
    lab.numberOfLines = 0;
    lab.text = message;
    [view addSubview:lab];
    [lab release];

    return view;
}

#pragma mark - UITextFieldDelegate
//将要开始编辑的时候,键盘弹出,改变底部视图和表的位置
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    //添加动画  216
    [UIView animateWithDuration:0.25 animations:^{
    //让_bottomView上去
    _bottomView.frame = CGRectMake(0, 480-44-216, 320, 44);
    //让表上去
    _tableView.frame = CGRectMake(0, 0, 320, 480-44-216);
    }];

    return YES;
}
//将要结束编辑,键盘下去,底部视图和表也下去
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    [UIView animateWithDuration:0.25 animations:^{
    //视图下去,回到初始位置
    _bottomView.frame = CGRectMake(0, 480-44, 320, 44);
    //改变表的位置
    _tableView.frame = CGRectMake(0, 0, 320, 480-44);
    }];
    
    return YES;
}
//点击return让键盘隐藏,失去第一响应
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    //resignFirstResponder失去第一响应
    [textField resignFirstResponder];
    return YES;
}

#pragma mark - 表的数据源和代理方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"cellID";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if (!cell)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID] autorelease];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    //先把添加的视图移除,防止重用
    UIView *view10 = [cell viewWithTag:10];
    [view10 removeFromSuperview];

    //显示要说的内容
    //从数组中获取要说的内容
    UIView *view = [_dataArray objectAtIndex:indexPath.row];
    [cell addSubview:view];

    return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //根据view的高度设置单元格的高度
    UIView *view = [_dataArray objectAtIndex:indexPath.row];
    return view.frame.size.height;
}

- (void)dealloc {
    [_dataArray release];
    [_textField release];
    [_bottomView release];
    [_tableView release];
    [super dealloc];
}
@end

附. UITextField 的代理方法
#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
NSLog(@"将要开始编辑");

    return YES;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    NSLog(@"已经开始编辑");
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    NSLog(@"将要结束编辑");

    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    NSLog(@"已经结束编辑");
}
//改变输入框内容的时候调用
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSLog(@"我要开始写啦");

    return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    NSLog(@"点击了return");
    //键盘弹出:成为第一响应becomeFirstResponder
    //键盘隐藏:失去第一响应resignFirstResponder
    //点击return键让键盘隐藏
    [textField resignFirstResponder];

    return YES;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容