• 聊天界面的优化


    #import <UIKit/UIKit.h>

    @class ChatMessage;

    @interface ChatViewController : UIViewController<UITextFieldDelegate,UITableViewDataSource,UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIScrollViewDelegate>

    - (IBAction)inputClick:(id)sender;

    - (IBAction)sendMessage:(id)sender;

    @property (weak, nonatomic) IBOutlet UITableView *tableChat;

    @property (weak, nonatomic) NSString *strMessage;

    @property (weak, nonatomic) IBOutlet UITextField *messageField;

    @property (weak, nonatomic) IBOutlet UIView *bottomBar;

    //@property (weak, nonatomic) NSString *chatto;

    @property (strong, nonatomic) ChatMessage *msg;

    @property (weak, nonatomic) UISwipeGestureRecognizer *leftSwipeGestutrReconiger;

    //- (IBAction)pickerView:(id)sender;

    //- (IBAction)moodViewShow:(id)sender;

    //- (IBAction)deleteMessage:(UIButton *)sender;

    @end

    #import "ChatViewController.h"

    #import "ChatMessage.h"

    #import "EGODatabase.h"

    #import "MessageCell.h"

    #import "MessageFrame.h"

    #import "IQKeyboardManager.h"

    #define ScreenHeight [[UIScreen mainScreen]bounds].size.height

    #define ScreenWidth [[UIScreen mainScreen]bounds].size.width

    @interface ChatViewController ()

    {

        NSMutableArray *arrayChatMessage;

        NSMutableArray* arrayMessagesFrame;

    }

    //@property (strong, nonatomic) IBOutlet UIScrollView *scroll;

    @property(nonatomic,strong)NSArray* emos;

    @end

    @implementation ChatViewController

    #pragma mark - View lifecycle

    - (void)setTitle:(NSString *)title

    {

        [super setTitle:title];

        UILabel *titleView = (UILabel *)self.navigationItem.titleView;

        if (!titleView) {

            titleView = [[UILabel alloc] initWithFrame:CGRectMake(100, 0, self.view.frame.size.width*2/5, 44)];

            titleView.backgroundColor = [UIColor clearColor];

            titleView.font = [UIFont fontWithName:@"HelveticaNeue" size:16];

            titleView.textColor = [UIColor whiteColor];

            titleView.textAlignment = UITextAlignmentCenter;

            

            self.navigationItem.titleView = titleView;

        }

        titleView.text = title;

        [titleView sizeToFit];

    }

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    {

        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

        if (self) {

            // Custom initialization

        }

        

        return self;

    }

    - (void)viewDidLoad

    {

        [super viewDidLoad];

        

        [self setTitle:self.msg.strContactName];

        //表情窗口初始化

    //    self.scroll.frame = CGRectMake(0, 0 - 200, ScreenWidth, 200);

        

        CGSize viewSize = [[UIScreen mainScreen] bounds].size;

        UIImageView *image = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"bg2.png"]];

        [image setFrame:CGRectMake(0, 0, viewSize.width, viewSize.height)];

        [self.view addSubview:image];

        [self.view sendSubviewToBack:image];

        

        [self.navigationController.navigationBar setBackgroundImage:[UIImage new]

                                                      forBarMetrics:UIBarMetricsDefault];

        self.navigationController.navigationBar.shadowImage = [UIImage new];

        self.navigationController.navigationBar.translucent = YES;

        

        self.tableChat.backgroundColor = [UIColor clearColor];

    // Do any additional setup after loading the view.

        if (!arrayMessagesFrame) {

            arrayMessagesFrame = [[NSMutableArray alloc]init];

        }

        

        //载入本地历史消息

        [self loadChatMessage];

        

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardWillShow:) name:UIKeyboardWillShowNotification object:nil];

        

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardWillHide:) name:UIKeyboardWillHideNotification object:nil];

        

        //设置textField输入起始位置

        self.messageField.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 0)];

        self.messageField.leftViewMode = UITextFieldViewModeAlways;

        

        self.messageField.delegate = self;

        

        [self registerEvents];

        

        CGRect frame = self.bottomBar.frame;

        frame.origin.y = self.view.frame.size.height - 44;

        [self.bottomBar setFrame:frame];

        

        //self.messageField.text = [NSString stringWithFormat:@" /微笑 "];

        if (arrayMessagesFrame.count > 0) {

            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:arrayMessagesFrame.count - 1 inSection:0];

            [self.tableChat scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

        }

        

    #ifdef __IPHONE_5_0

        float version = [[[UIDevice currentDevice] systemVersion] floatValue];

        if (version >= 5.0) {

            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardFrameDidChange:) name:UIKeyboardDidChangeFrameNotification object:nil];

        }

    #endif

        

        //表情列表解析

    //    NSString* path=[[NSBundle mainBundle]pathForResource:@"emoticons" ofType:@"plist"];

    //    self.emos=[NSArray arrayWithContentsOfFile:path];

    //    for (int i=0; i<self.emos.count; i++) {

    //        NSDictionary* dic=self.emos[i];

    //        NSString* emoName=[dic objectForKey:@"png"];

    //        UIImage* image=[UIImage imageNamed:emoName];

    //        UIButton* btn=[[UIButton alloc]initWithFrame:CGRectMake(i%8*40, i/8*40, 40, 40)];

    //        btn.tag=i;

    //        [btn setImage:image forState:UIControlStateNormal];

    //        [btn addTarget:self action:@selector(showName:) forControlEvents:UIControlEventTouchUpInside];

    //        [self.scroll addSubview:btn];

    //    }

    //    self.scroll.contentSize=CGSizeMake(self.view.bounds.size.width, self.emos.count/8*40);

    }

    //自定义表情方法

    //-(void)showName:(UIButton*)sender{

    //    NSDictionary* emoDic=[self.emos objectAtIndex:sender.tag];

    //    NSString* text=[emoDic objectForKey:@"chs"];

    //    

    //    self.messageField.text = [NSString stringWithFormat:@"%@%@",self.messageField.text,text];

    //    

    //}

    #pragma mark - 键盘处理

    #pragma mark 键盘即将显示

    -(void)keyBoardFrameDidChange:(NSNotification *)note

    {

    //    NSDictionary *userInfo = [notification userInfo];

    //    NSValue *aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];

    //    CGRect keyboardRect = [aValue CGRectValue];

    //    NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];

    //    NSTimeInterval animationDuration;

    //    [animationDurationValue getValue:&animationDuration];

        

        CGSize size = [[UIScreen mainScreen] bounds].size;//获取屏幕的尺寸;

        CGRect rect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];//得到键盘的高度;

        CGFloat ty = size.height - rect.size.height;//

        

        

        [UIView animateWithDuration:[note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue] animations:^{

            

            //frame.size.height -= rect.size.height;

           

            if (rect.origin.y != size.height) {

                CGRect frame = self.tableChat.frame;

                frame.size.height = size.height - rect.size.height - 105;//屏幕高度减去键盘高度减去输入框高度,就是新的table的高度,再赋给table,

                  [self.bottomBar setFrame:CGRectMake(0, ty-40, 320, 40)];

                 [self.tableChat setFrame:frame];

            }

            else{

                CGRect frame = self.tableChat.frame;

                frame.size.height = size.height - 40;

                [self.bottomBar setFrame:CGRectMake(0, size.height-40, ScreenWidth, 40)];

            }

            

    //        if (self.bottomBar.frame.origin.y == size.height - 40) {

    //            [self.bottomBar setFrame:CGRectMake(0, ty-40, 320, 40)];

    //        }

    //        else{

    //            [self.bottomBar setFrame:CGRectMake(0, size.height - 40, ScreenWidth, 40)];

    //        }

           

            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:arrayMessagesFrame.count - 1 inSection:0];

            if (arrayMessagesFrame.count== 0) {

                return ;

            }

            else

            {

                [self.tableChat scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

            }

        }];

    }

    - (void)keyBoardWillShow:(NSNotification *)note{

        

        CGSize size = [[UIScreen mainScreen] bounds].size;

        CGRect rect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];

        CGFloat ty = size.height - rect.size.height;

       

        [UIView animateWithDuration:[note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue] animations:^{

            CGRect frame = self.tableChat.frame;

            //frame.size.height -= rect.size.height;

            //frame.size.height = size.height - rect.size.height -40;

            frame.size.height = size.height - rect.size.height - 105;

            [self.tableChat setFrame:frame];

            

            [self.bottomBar setFrame:CGRectMake(0, ty-40, 320, 40)];

            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:arrayMessagesFrame.count - 1 inSection:0];

            if (arrayMessagesFrame.count== 0) {

                return ;

            }

            else

            {

                [self.tableChat scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

            }

        }];

        

        //[self.navigationController.navigationBar setHidden:YES];

    }

    #pragma mark 键盘即将退出

    - (void)keyBoardWillHide:(NSNotification *)note{

        

        CGSize size = [[UIScreen mainScreen] bounds].size;

        CGRect rect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];

        CGFloat ty = size.height - rect.size.height;

        

        [UIView animateWithDuration:[note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue] animations:^{

            CGRect frame = self.tableChat.frame;

            frame.size.height += rect.size.height - 60;

           

            [self.tableChat setFrame:frame];

            

            [self.bottomBar setFrame:CGRectMake(0, size.height-40, 320, 40)];

            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:arrayMessagesFrame.count - 1 inSection:0];

            if (arrayMessagesFrame.count== 0) {

                return ;

            }

            else

            {

                [self.tableChat scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

            }

        }];

        

    }

    #pragma mark - 文本框代理方法

    #pragma mark 点击textField键盘的回车按钮

    - (BOOL)textFieldShouldReturn:(UITextField *)textField{

        

        NSString *content = textField.text;

        if ([content isEqualToString:@""]) {

            return NO;

        }

        [self addMessageWithContent:content type:MessageTypeMe];

        

        NSUserDefaults *pref = [NSUserDefaults standardUserDefaults];

        NSString* strUid = [pref stringForKey:@"uid"];

        

       //NSString *strFrom = @"andy";

       // NSString *strTo   = @"andy";

        NSString *strMsg = [NSString stringWithFormat:@"{"type":"chat","from":"%@","to":"%@","msg":"%@"}",strUid,self.msg.strContact,content];

        

        NSLog(@"input message:%@",strMsg);

        [[NSNotificationCenter defaultCenter] postNotificationName:@"AppSendMessage" object:strMsg];

        

        [self.tableChat reloadData];

        

        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:arrayMessagesFrame.count - 1 inSection:0];

        [self.tableChat scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

        self.messageField.text = nil;

        

        return YES;

    }

    #pragma mark 给数据源增加内容

    - (void)addMessageWithContent:(NSString *)content type:(MessageType)type{

        

        MessageFrame *mf = [[MessageFrame alloc] init];

        ChatMessage *message = [[ChatMessage alloc] init];

        message.strMessage = content;

        message.strContact = self.msg.strContact;

        message.strContactName = self.msg.strContactName;

        message.strTimeStamp = [self generateTimeStamp];

        message.type = type;

        if (message.type == MessageTypeOther)

        {

            message.strContactIcon = [self getContactIconByTelephone:message.strContact];

        }

        else

        {

            NSUserDefaults *pref = [NSUserDefaults standardUserDefaults];

            NSString* strUid = [pref stringForKey:@"uid"];

            message.strContactIcon = [self getContactIconByTelephone:strUid];

        }

        

        mf.message = message;

        mf.showTime = YES;

        

        [arrayMessagesFrame addObject:mf];

    }

    - (NSString*)getContactAvatar:(NSString*)contactId

    {

        return @"defaultAvatar";

        

    /*    if ([contact.strAvatar isEqualToString:@""]) {

            cell.imageView.image = [UIImage imageNamed:@"defaultAvatar"];

        }

        else

        {

            NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/%@",contact.strAvatar]];

            

            BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:filePath];

            if(!fileExists)

            {

                cell.imageView.image = [UIImage imageNamed:@"defaultAvatar"];

                

                [self downloadAvatar:contact];

            }

            else

            {

                cell.imageView.image = [UIImage imageWithContentsOfFile:filePath];

            }

        }*/

    }

    - (void)loadChatMessage

    {

        if (!arrayChatMessage) {

            arrayChatMessage = [[NSMutableArray alloc]init];

        }

        

        EGODatabase* database = [EGODatabase databaseWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/database.db"]];

        

        //查询最新的消息,展示在首页聊天中,点击某一个聊天再查询该聊天下的所有历史消息

        NSString *sqlQuery = [[NSString alloc]initWithFormat:@"select * from chatmessage where contact = '%@'  order by timestamp",self.msg.strContact];

        NSLog(@"%@",sqlQuery);

        

        int i = 1;

        

        NSUserDefaults *pref = [NSUserDefaults standardUserDefaults];

        NSString* strUid = [pref stringForKey:@"uid"];

        

        EGODatabaseResult *result = [database executeQuery:sqlQuery];

        for(EGODatabaseRow* row in result) {

            MessageFrame *messageFrame = [[MessageFrame alloc] init];

            ChatMessage *msg = [[ChatMessage alloc]init];

            

            msg.strContact = [row stringForColumn:@"contact"];

            

            msg.strContactIcon = [self getContactIconByTelephone:msg.strContact];

            msg.strMessage = [row stringForColumn:@"message"];

            msg.strTimeStamp = [row stringForColumn:@"timestamp"];

            msg.type         = [row intForColumn:@"type"];

            if (msg.type == MessageTypeOther)

            {

                msg.strContactIcon = [self getContactIconByTelephone:msg.strContact];

            }

            else

            {

                msg.strContactIcon = [self getContactIconByTelephone:strUid];

            }

            [arrayChatMessage insertObject:msg atIndex:0];

            

            messageFrame.message = msg;

            messageFrame.showTime = YES;

            

            [arrayMessagesFrame addObject:messageFrame];

            

            i = !i;

            

            NSLog(@"chatview::load message:%@",msg.strMessage);

        }

        

        [database close];

    }

    - (NSString*)getContactIconByTelephone:(NSString*)tel

    {

        EGODatabase* database = [EGODatabase databaseWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/database.db"]];

        

        //查询所有联系人

        NSString *sqlQuery = [[NSString alloc]initWithFormat:@"select avatar from contact  where tel='%@'",tel];

        //NSLog(@"%@",sqlQuery);

        

        NSString* strIcon = @"";

        EGODatabaseResult *result = [database executeQuery:sqlQuery];

        for(EGODatabaseRow* row in result) {

            strIcon = [row stringForColumn:@"avatar"];

        }

        

        [database close];

        

        return strIcon;

    }

    - (void)registerEvents {

        // Register the analytics event that are going to be tracked by Baker.

        

        NSArray *analyticEvents = [NSArray arrayWithObjects:

                                   @"AppReceiveNewMessage",

                                   nil];

        

        for (NSString *eventName in analyticEvents) {

            [[NSNotificationCenter defaultCenter] addObserver:self

                                                     selector:@selector(receiveEvent:)

                                                         name:eventName

                                                       object:nil];

        }

    }

    - (void)receiveEvent:(NSNotification *)notification {

        // If you want, you can handle differently the various events

        if ([[notification name] isEqualToString:@"AppReceiveNewMessage"]) {

            

            NSLog(@"%@",notification.name);

            NSLog(@"%@",notification.object);

            

            NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

            NSDate *date = [NSDate date];

            fmt.dateFormat = @"MM-dd"; // @"yyyy-MM-dd HH:mm:ss"

            NSString *time = [fmt stringFromDate:date];

            

            //保存到数据库,更新首页聊天记录

            NSString *receiveData = (NSString *)notification.object;

            

            NSError *error = nil;

            NSData *jsonData = [receiveData dataUsingEncoding:NSUTF8StringEncoding];

            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];

            NSString* msgType = [dict objectForKey:@"type"];

            NSLog(@"msgtype is %@",msgType);

            

            //检查收到的消息是否是当前正在聊天的联系人发来的,是就更新聊天窗口,否就丢弃。主窗口会保存聊天记录。

            NSUserDefaults *pref = [NSUserDefaults standardUserDefaults];

            NSString* strCurrentChat = [pref stringForKey:@"CurrentChatContact"];

            NSString* chatFrom = [dict objectForKey:@"from"];

            if ([strCurrentChat isEqualToString:chatFrom]) {

                NSString* chatTo = [dict objectForKey:@"to"];

                NSString* msg = [dict objectForKey:@"msg"];

                

                if (![msg isEqualToString:@""]) {

                    [self addMessageWithContent:msg type:MessageTypeOther];

                    

                    [self.tableChat reloadData];

                    

                    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:arrayMessagesFrame.count - 1 inSection:0];

                    [self.tableChat scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

                }

            }

        }

    }

    - (NSString*)generateTimeStamp

    {

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

        [dateFormatter setDateStyle:NSDateFormatterMediumStyle];

        [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];

        [dateFormatter setDateFormat:@"yyyyMMddhhmmss"];

        NSString *timerid = [dateFormatter stringFromDate:[NSDate date]];

        

        return timerid;

    }

    - (void)viewDidAppear:(BOOL)animated

    {

        NSUserDefaults *pref = [NSUserDefaults standardUserDefaults];

        [pref setValue:self.msg.strContact forKey:@"CurrentChatContact"];

    }

    - (void)viewDidDisappear:(BOOL)animated

    {

        NSUserDefaults *pref = [NSUserDefaults standardUserDefaults];

        [pref setValue:@"" forKey:@"CurrentChatContact"];

    }

    - (void)didReceiveMemoryWarning

    {

        [super didReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    {

        return [arrayMessagesFrame count];

    }

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    {

        return [arrayMessagesFrame[indexPath.row] cellHeight];

    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    {

        static NSString *simpleTableIdentifier = @"MessageCell";

        

        MessageCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

        

        if (cell == nil) {

            cell = [[MessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];

        }

        

        // 设置数据

        cell.messageFrame = [arrayMessagesFrame objectAtIndex:indexPath.row];

        cell.contentView.backgroundColor = [UIColor clearColor];

        

        return cell;

    }

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    {

        [tableView deselectRowAtIndexPath:indexPath animated:NO];

        

        [self.messageField resignFirstResponder];

    }

    - (IBAction)sendMessage:(id)sender {

        self.strMessage = @"发吧";

        

       // [[NSNotificationCenter defaultCenter] postNotificationName:@"AppSendMessage" object:self.strMessage];

    }

    - (IBAction)inputClick:(id)sender {

    }

    @end

  • 相关阅读:
    Python
    Python
    Python
    Django REST framework
    Django REST framework
    Django REST framework
    Django REST framework
    jquery.unobtrusive-ajax.js的扩展,做到片段式加载
    jquery.unobtrusive-ajax.js单独的用法
    不复杂的Autofac注入
  • 原文地址:https://www.cnblogs.com/tuhaoYY/p/3898675.html
Copyright © 2020-2023  润新知