赞
踩
用户聊天界面
Demo:http://download.csdn.net/detail/u012881779/8613413
部分代码:
-
- @interface ProcessMessage ()<UITextViewDelegate,UITableViewDataSource,UITableViewDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate >
-
- @property (nonatomic) float gKeyBoardH;
- @property (nonatomic) CGRect gTVrect;
- @property (weak, nonatomic) IBOutlet UIView *gSendV; //发送栏视图
- @property (weak, nonatomic) IBOutlet UIButton *gSendBut; //发送
- @property (weak, nonatomic) IBOutlet UITextView *gImputTxtV; //输入框
- @property (weak, nonatomic) IBOutlet UITableView *gProcessTV; //消息TV
- @property (strong, nonatomic) NSMutableArray *gCellHeightArr ;//cell高
- @property (strong, nonatomic) NSMutableArray *gMessageInfo; //消息内容
- @property (strong, nonatomic) VoiceInfo *gVoice; //语音
- @property (strong, nonatomic) PictureInfo *gPicture; //图片
- @property (strong, nonatomic) NSString *gMyObjectID; //自己的ID
- @property (strong, nonatomic) NSString *gObjectID; //交谈对象ID
- @property (strong, nonatomic) NSString *gUserid; //自己ID
- @property (strong, nonatomic) AudioRecord *mAudioRecord;
- @property (strong, nonatomic) AVAudioPlayer *gAudioPlayer;
- @property (strong, nonatomic) ProcessAudioPlay *gProcessAPlayer;
- @property (strong, nonatomic) IBOutlet UIView *uploadView; //加载更多视图
- @property (strong, nonatomic) IBOutlet UIView *uploadNilView; //表尾为空
- @property (weak, nonatomic) IBOutlet UIButton *tapLoadBut; //点击加载But
- @property (weak, nonatomic) IBOutlet UIView *loadingView; //加载View
- @property (weak, nonatomic) IBOutlet UILabel *titleLab;
- @property (nonatomic) NSInteger leftPageNum;
-
- @end
-
- @implementation ProcessMessage
-
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- [self.view setFrame:[[UIScreen mainScreen] bounds]];
-
- if(!self.gCellHeightArr){
- self.gCellHeightArr = [[NSMutableArray alloc] init];
- }
- if(!self.gMessageInfo){
- self.gMessageInfo = [[NSMutableArray alloc] init];
- }
-
- [_gProcessTV setTransform:CGAffineTransformMakeRotation(M_PI)];
- [_gProcessTV setTableFooterView:_uploadView];
- [_uploadView setTransform:CGAffineTransformMakeRotation(M_PI)];
-
- //参数设置
- _leftPageNum = 1;
- _gMyObjectID = @"50";
- _gUserid = @"50";
- _gObjectID = @"60";
-
- //消息TableView
- [self cMessageTableView];
-
- //消息发送栏
- [self cMessageSend:40];
-
- //增加监听,当键盘出现或改变时收出消息
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(keyboardWillShow:)
- name:UIKeyboardWillShowNotification
- object:nil];
- //增加监听,当键退出时收出消息
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(keyboardWillHide:)
- name:UIKeyboardWillHideNotification
- object:nil];
-
- }
-
- //消息TableView
- -(void)cMessageTableView{
- self.gTVrect = _gProcessTV.frame;
- [_gProcessTV setSeparatorStyle:NO];
- }
-
- //消息发送栏
- -(void)cMessageSend:(float)sendVH{
- if(sendVH < 40){
- sendVH = 40;
- }else if(sendVH > 100){
- sendVH = 100;
- }
- if(sendVH == 60 || sendVH == 78){
- [_gImputTxtV setContentOffset:CGPointMake(0, 0) animated:YES];
- }
-
- //消息发送栏高度动态调整
- CGRect sendViewRect = _gSendV.frame;
- sendViewRect.origin.y = sendViewRect.origin.y - (sendVH-sendViewRect.size.height);
- sendViewRect.size.height = sendVH;
- [UIView animateWithDuration:0.2 animations:^{
- [_gSendV setFrame:sendViewRect];
- } completion:^(BOOL finished){}];
-
- //tablevie高度适配
- CGRect tvRect = _gProcessTV.frame;
- float tvHeight = _gSendV.frame.origin.y - tvRect.origin.y;
- tvRect.size.height = tvHeight;
- [_gProcessTV setFrame:tvRect];
-
- //发送按钮状态
- BOOL judge = 0;
- for (int i = 0; i < [_gImputTxtV.text length]; i ++) {
- NSString *str = [_gImputTxtV.text substringWithRange:NSMakeRange(i, 1)];
- if(![str isEqualToString:@" "]){
- if(![str isEqualToString:@"\n"]){
- judge = 1;
- }
- }
- }
- if(judge){
- [_gSendBut setBackgroundImage:[UIImage imageNamed:@"蓝按钮.png"] forState:UIControlStateNormal];
- [_gSendBut setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
- }else{
- [_gSendBut setBackgroundImage:[UIImage imageNamed:@"发送按钮.png"] forState:UIControlStateNormal];
- [_gSendBut setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
- }
-
- //输入框
- [_gImputTxtV.layer setCornerRadius:5];
- [_gImputTxtV.layer setBorderWidth:1];
- [_gImputTxtV.layer setBorderColor:[[UIColor colorWithRed:228.0/255 green:228.0/255 blue:228.0/255 alpha:1] CGColor] ];
-
- }
-
- //发送消息button关联事件
- - (IBAction)downTapAction:(id)sender {
- UIButton *tempBut = (UIButton *)sender;
- if(tempBut.tag == 4100){
- //语音
- if(!_gVoice){
- NSArray* array = [[NSBundle mainBundle] loadNibNamed:@"VoiceInfo" owner:nil options:nil];
- _gVoice = (VoiceInfo*)[array objectAtIndex:0];
- //关联事件
- [_gVoice.but0 addTarget:self action:@selector(gCancelVoice:) forControlEvents:UIControlEventTouchUpInside];
- [_gVoice.but1 addTarget:self action:@selector(gVoiceDown:) forControlEvents:UIControlEventTouchDown];
- [_gVoice.but1 addTarget:self action:@selector(gVoiceInside:) forControlEvents:UIControlEventTouchUpInside];
- [_gVoice.but1 addTarget:self action:@selector(gVoiceOutside:) forControlEvents:UIControlEventTouchUpOutside];
- }
- [_gVoice setFrame:[[UIScreen mainScreen] bounds]];
- CGRect tempPicRect = _gVoice.gViewOne.frame;
- tempPicRect.origin.y = [[UIScreen mainScreen] bounds].size.height - tempPicRect.size.height;
- _gVoice.gViewOne.frame = tempPicRect;
-
- CGRect rectOne = _gVoice.frame;
- CGRect rectTwo = self.view.frame;
- float changeF = rectTwo.size.height - rectOne.size.height;
- rectOne.origin.y = changeF;
- [_gVoice setFrame:rectOne];
- [self.view addSubview:_gVoice];
- CGRect tempRect = _gVoice.frame;
- CGRect tempRectOne = tempRect;
- tempRectOne.origin.y = self.view.frame.size.height;
- [_gVoice setFrame:tempRectOne];
- //动画
- [_gVoice setAlpha:0];
- [_gVoice.gViewOne setAlpha:0];
- [_gVoice.gImgV setAlpha:0];
- [UIView animateWithDuration:0.3 animations:^{
- [_gVoice setFrame:tempRect];
- [_gVoice setAlpha:1];
- [_gVoice.gViewOne setAlpha:1];
- [_gVoice.gImgV setAlpha:0.2];
- } completion:^(BOOL finished){}];
- [self cReturnLocation];
-
- }else if(tempBut.tag == 4101){
- //图片
- if(!_gPicture){
- NSArray* array = [[NSBundle mainBundle] loadNibNamed:@"PictureInfo" owner:nil options:nil];
- _gPicture = (PictureInfo*)[array objectAtIndex:0];
- //关联事件
- [_gPicture.but0 addTarget:self action:@selector(gCancel:) forControlEvents:UIControlEventTouchUpInside];
- [_gPicture.but1 addTarget:self action:@selector(gPlot:) forControlEvents:UIControlEventTouchUpInside];
- [_gPicture.but2 addTarget:self action:@selector(gPlot:) forControlEvents:UIControlEventTouchUpInside];
- [_gPicture.but3 addTarget:self action:@selector(gPlot:) forControlEvents:UIControlEventTouchUpInside];
- }
- [_gPicture setFrame:[[UIScreen mainScreen] bounds]];
- CGRect tempPicRect = _gPicture.gViewOne.frame;
- tempPicRect.origin.y = [[UIScreen mainScreen] bounds].size.height - tempPicRect.size.height;
- _gPicture.gViewOne.frame = tempPicRect;
-
- CGRect rectOne = _gPicture.frame;
- CGRect rectTwo = self.view.frame;
- float changeF = rectTwo.size.height - rectOne.size.height;
- rectOne.origin.y = changeF;
- [_gPicture setFrame:rectOne];
- [self.view addSubview:_gPicture];
- CGRect tempRect = _gPicture.frame;
- CGRect tempRectOne = tempRect;
- tempRectOne.origin.y = self.view.frame.size.height;
- [_gPicture setFrame:tempRectOne];
- //动画
- [_gPicture setAlpha:0];
- [_gPicture.gViewOne setAlpha:0];
- [_gPicture.gImgV setAlpha:0];
- [UIView animateWithDuration:0.3 animations:^{
- [_gPicture setFrame:tempRect];
- [_gPicture setAlpha:1];
- [_gPicture.gViewOne setAlpha:1];
- [_gPicture.gImgV setAlpha:0.2];
- } completion:^(BOOL finished){}];
- [self cReturnLocation];
-
- //文本
- }else if(tempBut.tag == 4102){
- //发送
- BOOL judge = 0;
- for (int i = 0; i < [_gImputTxtV.text length]; i ++) {
- NSString *str = [_gImputTxtV.text substringWithRange:NSMakeRange(i, 1)];
- if(![str isEqualToString:@" "]){
- if(![str isEqualToString:@"\n"]){
- judge = 1;
- }
- }
- }
- if(judge){
- long int temptime = [self cNowTimestamp ];
- //消息发送时 立即插入数据库
- [self cInsertLibaryWithID:temptime andContent:_gImputTxtV.text andType:1 andFileinfo:0];
- }else{
- }
- [self.gCellHeightArr removeAllObjects];
- [_gProcessTV reloadData];
- _gImputTxtV.text = nil;
- }
- [self cMessageSend:40];
- [_gProcessTV setContentOffset:CGPointMake(0, 0)];
-
- }
-
- //图片发送
- - (void)gCancel:(id)sender{
- CGRect tempRect = _gPicture.gViewOne.frame;
- tempRect.origin.y = _gPicture.frame.size.height;
- //动画
- [UIView animateWithDuration:0.35 animations:^{
- [_gPicture.gViewOne setFrame:tempRect];
- [_gPicture.gViewOne setAlpha:0];
- [_gPicture.gImgV setAlpha:0];
- } completion:^(BOOL finished){
- [_gPicture removeFromSuperview];
- }];
- }
-
- - (void)gPlot:(id)sender{
- NSInteger tag = [sender tag];
- CGFloat height = [UIScreen mainScreen].bounds.size.height;
- UIView* subview = (UIView*)[self.view viewWithTag:135];
- CGRect rect = subview.frame;
- rect.origin.y = 1.0*height;
-
- [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{
- _gPicture.alpha = 0.0;
- subview.frame = rect;
- } completion:^(BOOL finished) {
- if (finished) {
- [_gPicture removeFromSuperview];
- if (tag == 13) {//拍照
- [self presentImageViewControllerWithCameraAvailable:1];
- } else if (tag == 15) {//我的标绘
-
- } else {//手机相册
- [self presentImageViewControllerWithCameraAvailable:0];
- }
- }
- }];
- }
-
- - (void)presentImageViewControllerWithCameraAvailable:(NSUInteger)isAvaiable
- {
- UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
- pickerController.delegate = self;
- if (isAvaiable == 1) {
- if (![UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]) {
- UIAlertView* alertView =
- [[UIAlertView alloc] initWithTitle:nil
- message:@"设备不支持拍照"
- delegate:nil
- cancelButtonTitle:@"确定"
- otherButtonTitles: nil];
- [alertView show];
- return;
- }
-
- pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
- } else {
- pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
- }
- pickerController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
- [self presentViewController:pickerController animated:YES completion:NULL];
-
- }
-
- #pragma mark - UIImagePickerControllerDelegate
- - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
- {
- UIImage *sourceImage = (UIImage *)[info valueForKey:UIImagePickerControllerOriginalImage];
- if (sourceImage == nil) {
- NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL];
- ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *asset)
- {
- ALAssetRepresentation *representation = [asset defaultRepresentation];
- UIImage *originalImage = [UIImage imageWithCGImage:[representation fullResolutionImage]];
- NSData* data = UIImageJPEGRepresentation(originalImage, 0.8);
- if (data) {
- NSString* filePath = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
- filePath = [filePath stringFromMD5];
- NSString* fileItem = [NSString stringWithFormat:@"%@_P.jpg",filePath];
- NSString* picPath = [self getUserMessagePictureFileSavePath];
- picPath = [picPath stringByAppendingPathComponent:fileItem];
- if (![[NSFileManager defaultManager] fileExistsAtPath:picPath]) {
- BOOL bSuccess = [[NSFileManager defaultManager] createFileAtPath:picPath contents:data attributes:NULL];
- if (bSuccess) {
- [self cPicPicChioce:picPath];
- }
- }
- } else {
- UIAlertView* alertView =
- [[UIAlertView alloc] initWithTitle:nil
- message:@"图片已损坏"
- delegate:nil
- cancelButtonTitle:@"确定"
- otherButtonTitles: nil];
- [alertView show];
- }
- [picker dismissViewControllerAnimated:YES completion:NULL];
- };
- ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
- [assetslibrary assetForURL:imageURL
- resultBlock:resultblock
- failureBlock:nil];
- } else {
- NSData* data = UIImageJPEGRepresentation(sourceImage, 0.8);
- NSString* filePath = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
- filePath = [filePath stringFromMD5];
- NSString* fileItem = [NSString stringWithFormat:@"%@_P.jpg",filePath];
- NSString* picPath = [self getUserMessagePictureFileSavePath];
- picPath = [picPath stringByAppendingPathComponent:fileItem];
- if (![[NSFileManager defaultManager] fileExistsAtPath:picPath]) {
- BOOL bSuccess = [[NSFileManager defaultManager] createFileAtPath:picPath contents:data attributes:NULL];
- if (bSuccess) {
- [self cPicPicChioce:picPath];
- }
- }
- [picker dismissViewControllerAnimated:YES completion:NULL];
- }
- }
-
- -(void)cPicPicChioce:(NSString *)picPath{
- if(picPath){
- [self cMessageTableView];
- long int temptime = [self cNowTimestamp];
- //消息发送时 立即插入数据库
- [self cInsertLibaryWithID:temptime andContent:picPath andType:2 andFileinfo:0];
- [_gProcessTV reloadData];
- }
- }
-
- - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
- {
- [picker dismissViewControllerAnimated:YES completion:NULL];
- }
-
- //标绘图片1
- -(void)didEndCell:(NSInteger)mid path:(NSString*)path controller:(UIViewController *)VC
- {
- if (path.length != 0) {
- //消息中心,选择图片复制
- UIImage *sourceImage = (UIImage *)[UIImage imageWithContentsOfFile:path];
- NSData* data = UIImageJPEGRepresentation(sourceImage, 0.8);
- NSString* filePath = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
- filePath = [filePath stringFromMD5];
- NSString* fileItem = [NSString stringWithFormat:@"%@_P.jpg",filePath];
- NSString* picPath = [self getUserMessagePictureFileSavePath];
- picPath = [picPath stringByAppendingPathComponent:fileItem];
- if (![[NSFileManager defaultManager] fileExistsAtPath:picPath]) {
- BOOL bSuccess = [[NSFileManager defaultManager] createFileAtPath:picPath contents:data attributes:NULL];
- if (bSuccess) {
- if(picPath){
- long int temptime = [self cNowTimestamp];
- //消息发送时 立即插入数据库
- [self cInsertLibaryWithID:temptime andContent:picPath andType:2 andFileinfo:0];
- [_gProcessTV reloadData];
- }
- }
- }
- }
- }
-
- //语音
- //录音被取消
- - (void)gCancelVoice:(id)sender{
- CGRect tempRect = _gVoice.gViewOne.frame;
- tempRect.origin.y = _gVoice.frame.size.height;
- [UIView animateWithDuration:0.35 animations:^{
- [_gVoice.gViewOne setFrame:tempRect];
- [_gVoice.gViewOne setAlpha:0];
- [_gVoice.gImgV setAlpha:0];
- } completion:^(BOOL finished){
- [_gVoice removeFromSuperview];
- }];
- }
-
- //录音开始
- - (void)gVoiceDown:(id)sender{
- if (![AudioRecord hasMicphone]) {
- UIAlertView* alertView =
- [[UIAlertView alloc] initWithTitle:nil
- message:@"设备不支持录音"
- delegate:nil
- cancelButtonTitle:@"确定"
- otherButtonTitles: nil];
- [alertView show];
- return;
- }
- if ([AudioRecord isMuted]) {
- UIAlertView* alertView =
- [[UIAlertView alloc] initWithTitle:nil
- message:@"设备处于静音状态,请调高音量"
- delegate:nil
- cancelButtonTitle:@"确定"
- otherButtonTitles: nil];
- [alertView show];
- return;
- }
- if ([[self fetchSystemVersion] floatValue] >= 7.0) {
- //麦克风授权
- [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
- if (granted) {
- NSString* filePath = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
- filePath = [filePath stringFromMD5];
- NSString* fileItem = [NSString stringWithFormat:@"%@_A.caf",filePath];
- NSString* audioPath = [self getUserMessageAudioFileSavePath];
- audioPath = [audioPath stringByAppendingPathComponent:fileItem];
- if(!self.mAudioRecord){
- self.mAudioRecord = [[AudioRecord alloc] init];
- }
- [self.mAudioRecord startRecordWithPath:audioPath];
- } else {
- UIAlertView* alertView =
- [[UIAlertView alloc] initWithTitle:nil
- message:@"用户不允许使用麦克风"
- delegate:nil
- cancelButtonTitle:@"确定"
- otherButtonTitles: nil];
- [alertView show];
- return;
- }
- }];
- } else {
- NSString* filePath = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
- filePath = [filePath stringFromMD5];
- NSString* fileItem = [NSString stringWithFormat:@"%@_A.caf",filePath];
- NSString* audioPath = [self getUserMessageAudioFileSavePath];
- audioPath = [audioPath stringByAppendingPathComponent:fileItem];
- if(!self.mAudioRecord){
- self.mAudioRecord = [[AudioRecord alloc] init];
- }
- [self.mAudioRecord startRecordWithPath:audioPath];
- }
- }
-
- //录音结束
- - (void)gVoiceInside:(id)sender{
- [self.mAudioRecord stopRecord];
- CGFloat height = [UIScreen mainScreen].bounds.size.height;
- UIView* subview = (UIView*)[_gVoice.gViewOne viewWithTag:125];
- CGRect rect = subview.frame;
- rect.origin.y = 1.0*height;
- [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{
- _gVoice.alpha = 0.0;
- subview.frame = rect;
- } completion:^(BOOL finished) {
- if (finished) {
- [_gVoice removeFromSuperview];
- }
- }];
-
- if (self.mAudioRecord.recordTime < 0.5f) {//录音时间太短了
- if ([[NSFileManager defaultManager] fileExistsAtPath:self.mAudioRecord.recordPath]) {
- [[NSFileManager defaultManager] removeItemAtPath:self.mAudioRecord.recordPath error:NULL];
- }
- self.mAudioRecord = nil;
- UIAlertView* alertView =
- [[UIAlertView alloc] initWithTitle:nil
- message:@"录音时间太短了"
- delegate:nil
- cancelButtonTitle:@"确定"
- otherButtonTitles: nil];
- [alertView show];
- return;
- } else if (self.mAudioRecord.averagePower < -40.0) {//小于-40分贝,表示没有说话
- if ([[NSFileManager defaultManager] fileExistsAtPath:self.mAudioRecord.recordPath]) {
- [[NSFileManager defaultManager] removeItemAtPath:self.mAudioRecord.recordPath error:NULL];
- }
- self.mAudioRecord = nil;
- UIAlertView* alertView =
- [[UIAlertView alloc] initWithTitle:nil
- message:@"你的声音太小了"
- delegate:nil
- cancelButtonTitle:@"确定"
- otherButtonTitles: nil];
- [alertView show];
- return;
- }
-
- NSString* destPath = self.mAudioRecord.recordPath;
- destPath = [destPath substringToIndex:destPath.length-6];
- //储存路径
- NSString* path = [NSString stringWithFormat:@"%@_%d_A.caf", destPath, (int)self.mAudioRecord.recordTime+1];
- if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
- BOOL bSuccess = [[NSFileManager defaultManager] copyItemAtPath:self.mAudioRecord.recordPath toPath:path error:NULL];
- if (bSuccess) {
- [[NSFileManager defaultManager] removeItemAtPath:self.mAudioRecord.recordPath error:NULL];
- }
- }
- self.mAudioRecord = nil;
- //.caf转换为.mp3
- NSString *voiPathMP3 = [self audio_PCMtoMP3:path];
- if(voiPathMP3){
- _gProcessAPlayer = [ProcessAudioPlay sharedProcessAudioPlayAction];
- [_gProcessAPlayer cPlayerData:voiPathMP3];
- _gAudioPlayer = [_gProcessAPlayer gAudioPlayer];
- NSInteger voiInt = _gAudioPlayer.duration;//语音时间
- if(voiInt < 1){
- voiInt = 1;
- }
- long int temptime = [self cNowTimestamp];
- //消息发送时 立即插入数据库
- [self cInsertLibaryWithID:temptime andContent:voiPathMP3 andType:3 andFileinfo:voiInt];
-
- [_gProcessTV reloadData];
-
- }
- }
- //录音被取消
- - (void)gVoiceOutside:(id)sender{
- [self.mAudioRecord cancelRecord];
- self.mAudioRecord = nil;
- CGFloat height = [UIScreen mainScreen].bounds.size.height;
- UIView* subview = (UIView*)[_gVoice.gViewOne viewWithTag:125];
- CGRect rect = subview.frame;
- rect.origin.y = 1.0*height;
- [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{
- _gVoice.alpha = 0.0;
- subview.frame = rect;
- } completion:^(BOOL finished) {
- if (finished) {
- [_gVoice removeFromSuperview];
- }
- }];
- UIAlertView* alertView =
- [[UIAlertView alloc] initWithTitle:nil
- message:@"录音被取消了"
- delegate:nil
- cancelButtonTitle:@"确定"
- otherButtonTitles: nil];
- [alertView show];
- }
- //.caf转换为.mp3
- -(NSString *)audio_PCMtoMP3:(NSString *)cafPath{
- NSString *cafFilePath = cafPath;
- NSMutableString *changeName = [cafFilePath mutableCopy];
- NSString *changePath;
- if([[changeName substringFromIndex:changeName.length-3] isEqualToString:@"caf"]){
- changePath = [changeName substringToIndex:changeName.length-3];
- }
- NSString *mp3FilePath;
- if(changePath){
- mp3FilePath = [NSString stringWithFormat:@"%@mp3",changePath];
- }
- @try {
- int read, write;
- FILE *pcm = fopen([cafFilePath cStringUsingEncoding:1], "rb"); //source 被转换的音频文件位置
- fseek(pcm, 4*1024, SEEK_CUR); //skip file header
-
- FILE *mp3 = fopen([mp3FilePath cStringUsingEncoding:1], "wb"); //output 输出生成的Mp3文件位置
-
- const int PCM_SIZE = 8192;
- const int MP3_SIZE = 8192;
- short int pcm_buffer[PCM_SIZE*2];
- unsigned char mp3_buffer[MP3_SIZE];
-
- lame_t lame = lame_init();
- lame_set_num_channels(lame,2);//设置1为单通道,默认为2双通道
- lame_set_in_samplerate(lame, 11025.0);//44100.0);//11025.0
- lame_set_VBR(lame, vbr_default);
- lame_set_brate(lame,8);
- lame_set_mode(lame,3);
- lame_set_quality(lame,2); /* 2=high 5 = medium 7=low 音质*/
- lame_init_params(lame);
- do {
- read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);
- if (read == 0)
- write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
- else
- write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
-
- fwrite(mp3_buffer, write, 1, mp3);
-
- } while (read != 0);
-
- lame_close(lame);
- fclose(mp3);
- fclose(pcm);
- }
- @catch (NSException *exception) {
-
- }
- @finally {
- //若转换成功, 删除caf文件
- NSFileManager* fileManager=[NSFileManager defaultManager];
- if([fileManager contentsAtPath:mp3FilePath]){
- [fileManager removeItemAtPath:cafFilePath error:nil];
- }
- }
- return mp3FilePath;
- }
-
- //消息发送时 立即插入数据库
- -(void)cInsertLibaryWithID:(long int)theID andContent:(NSString *)theContent andType:(NSInteger)theType andFileinfo:(NSInteger)theFileinfo{
-
- NSString *groupID = @"0";
- NSString *groupName = @"";
- NSString *sendName = @"";
- if([_titleLab.text isEqualToString:@"张三(收)"]){
- sendName = @"张三";
- }else{
- sendName = @"李四";
- }
- NSString *myID = _gMyObjectID;
- NSMutableDictionary *messageSend = [[NSMutableDictionary alloc] init];
- [messageSend setObject:[NSNumber numberWithLong:theID] forKey:@"id"];
- [messageSend setObject:theContent forKey:@"content"];
- [messageSend setObject:[NSNumber numberWithInt:theType] forKey:@"type"];
- [messageSend setObject:[NSNumber numberWithLong:theID] forKey:@"addtime"];
- [messageSend setObject:@"" forKey:@"fileinfo"];
- [messageSend setObject:_gObjectID forKey:@"receive_uid"];
- [messageSend setObject:[NSNumber numberWithInt:0] forKey:@"rectime"];
- [messageSend setObject:[NSString stringWithFormat:@"%@",myID] forKey:@"send_uid"];
- [messageSend setObject:sendName forKey:@"send_uname"];
- [messageSend setObject:[NSNumber numberWithInt:1] forKey:@"send"];//2 请求,0 失败,1 成功
- [messageSend setObject:[NSNumber numberWithInt:theFileinfo] forKey:@"fileinfo"];
- [messageSend setObject:groupID forKey:@"groupid"];
- [messageSend setObject:groupName forKey:@"groupname"];
-
- //插入数据库 默认为未发送成功
- [self cSendTalkDatabaseInsertInto:messageSend];
- messageSend = nil;
- }
-
- //消息发送时 数据库插入 用户交谈
- -(void)cSendTalkDatabaseInsertInto:(NSDictionary *)talkDict{
- //特殊字符转换——
- NSString *strContent = [talkDict objectForKey:@"content"];
- if(strContent == nil || [strContent isEqualToString:@""]){
- strContent = [talkDict objectForKey:@"content"];
- }
- //现在表中查询有没有相同的元素,如果有,做修改操作
- NSString *sqlCodeOne = [NSString stringWithFormat:@"select * from UserTalk where Tid = %lld",[[talkDict objectForKey:@"id"] longLongValue]];
- PTDBManage* manager = [[PTDBManage alloc] init];
- FMResultSet *rs = [[manager startDB] executeQuery:sqlCodeOne];
- BOOL result = NO;
- if([rs next])
- {
- result = YES;
- }
- [rs close];
- [manager endDB];
-
- if(!result){
- //3.插入
- NSString *sqlCode = [NSString stringWithFormat:@"INSERT INTO UserTalk (Tid,Ttype,Tsend_uid,Tsend_uname,Treceive_uid,Tcontent,Taddtime,Trectime,Tsend,TfileInfo,Fuserid,Fobjectid,UGroupId,UGroupName) VALUES (%d,%d,'%@','%@','%@','%@',%d,%d,%d,%d,'%@','%@','%@','%@')",
- [[talkDict objectForKey:@"id"] intValue],
- [[talkDict objectForKey:@"type"] intValue],
- [talkDict objectForKey:@"send_uid"],
- [talkDict objectForKey:@"send_uname"],
- [talkDict objectForKey:@"receive_uid"],
- strContent,
- [[talkDict objectForKey:@"addtime"] intValue],
- [[talkDict objectForKey:@"rectime"] intValue],
- [[talkDict objectForKey:@"send"] intValue],
- [[talkDict objectForKey:@"fileinfo"] intValue],
- _gUserid,
- _gObjectID,
- [talkDict objectForKey:@"groupid"],
- [talkDict objectForKey:@"groupname"]
-
- ];
- //插入数据使用OC中的类型 text对应为NSString integer对应为NSNumber的整形
- manager = [[PTDBManage alloc] init];
- BOOL success = [[manager startDB] executeUpdate:sqlCode];
- if(success){
- NSLog(@"---------insert DB sucess-----------");
- }else{
- NSLog(@"---------insert DB faile------------");
- }
- [manager endDB];
- }
- }
-
- -(void)cReturnDown{
- UIView *tempV = (UIView *)[self.view viewWithTag:6500];
- [UIView animateWithDuration:0.2 animations:^{
- [tempV setFrame:CGRectMake(0, self.view.frame.size.height-150, self.view.frame.size.width, 150)];
- } completion:^(BOOL finished){}];
- }
-
- //获得当前时间
- -(NSString *)cAcquireNowTime:(NSString *)timestamp{
- NSDate *timeData = [NSDate dateWithTimeIntervalSince1970:[timestamp intValue]];
- NSDateFormatter *dateFormatter =[[NSDateFormatter alloc] init];
- [dateFormatter setDateFormat:@"yyyy年M月d日 HH:mm"];
- NSString *strTime = [dateFormatter stringFromDate:timeData];
- [dateFormatter setDateFormat:@"HH:mm"];
- NSString *strTimeTwo = [dateFormatter stringFromDate:timeData];
- [dateFormatter setDateFormat:@"yyyy"];
- NSString *strYear = [dateFormatter stringFromDate:timeData];
- [dateFormatter setDateFormat:@"M"];
- NSString *strMonth = [dateFormatter stringFromDate:timeData];
- [dateFormatter setDateFormat:@"d"];
- NSString *strDay = [dateFormatter stringFromDate:timeData];
-
- if([timestamp isEqualToString:@""]){
- return @"";
- }else{
- if(![strDay isEqualToString:[self cNowTimestamp:@"d"]]){
- return strTime;
- }else if([strYear isEqualToString:[self cNowTimestamp:@"yyyy"]] && [strMonth isEqualToString:[self cNowTimestamp:@"M"]] && [strDay isEqualToString:[self cNowTimestamp:@"d"]]){
- return strTimeTwo;
- }
- }
- return strTime;
- }
-
- //当前时间的时间戳_日
- -(NSString *)cNowTimestamp:(NSString *)theMark{
- long int timeSp = [self cNowTimestamp];
- NSDate *timeData = [NSDate dateWithTimeIntervalSince1970:timeSp];
- NSDateFormatter *dateFormatter =[[NSDateFormatter alloc] init];
- [dateFormatter setDateFormat:theMark];
- NSString *strTime = [dateFormatter stringFromDate:timeData];
- return strTime;
- }
-
- //Cell自适应高度
- -(CGRect)cAdaptCellHeight:(NSString *)theStr{
- NSString *desContent = theStr; //获取文本内容
- CGRect orgRect = CGRectMake(0, 0, 0, 0); //获取原始UITextView的frame
- CGSize size = [desContent sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize:CGSizeMake(230-20, 2000) lineBreakMode:NSLineBreakByWordWrapping];
- orgRect.size.height = size.height;
- return orgRect;
- }
-
- //发送消息块 移动
- -(void)cMoveLocation{
- CGRect sendRect = _gSendV.frame;
- sendRect.origin.y = self.view.frame.size.height - _gKeyBoardH-_gSendV.frame.size.height;
- CGRect tvrect = self.gTVrect;
- tvrect.size.height = tvrect.size.height - _gKeyBoardH;
-
- [UIView animateWithDuration:0.25 animations:^{
- [_gSendV setFrame:sendRect];
- [_gProcessTV setFrame:tvrect];
- } completion:^(BOOL finished){}];
-
- [_gProcessTV setContentOffset:CGPointMake(0, 0) animated:YES];
- }
-
- //发送消息块 归位
- -(void)cReturnLocation{
- CGRect tempRect = _gSendV.frame;
- tempRect.origin.y = self.view.frame.size.height-_gSendV.frame.size.height;
- [self.view endEditing:YES];
- [_gProcessTV setFrame:self.gTVrect];
- [_gProcessTV reloadData];
- [UIView animateWithDuration:0.25 animations:^{
- [_gSendV setFrame:tempRect];
- } completion:^(BOOL finished){
- _gKeyBoardH = 0;
- }];
- }
-
- //当键盘出现或改变时调用
- - (void)keyboardWillShow:(NSNotification *)aNotification{
- NSDictionary *userInfo = [aNotification userInfo];
- NSValue *aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
- CGRect keyboardRect = [aValue CGRectValue];
- int height = keyboardRect.size.height;
- _gKeyBoardH = height;
- [self cMoveLocation];
- }
-
- //当键退出时调用
- - (void)keyboardWillHide:(NSNotification *)aNotification{
- [self cReturnLocation];
- }
-
- #pragma mark UITextViewDelegate
- - (void)textViewDidChange:(UITextView *)textView{
- if (textView.tag == 4200) {
- CGSize textSize = textView.contentSize;
- textSize.height = textSize.height + 8;
- [textView setContentSize:textSize];
- [self cMessageSend:textView.contentSize.height];
- }
- }
-
- #pragma mark UITableViewDataSource
- - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
- [self.gCellHeightArr removeAllObjects];
- return 1;
- }
-
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
- //从数据库获取数据
- [self cTalkTVRowAction];
- NSInteger returnRow;
- returnRow = [self.gMessageInfo count];
- return returnRow;
- }
-
- //数据准备
- -(void)cTalkTVRowAction{
- NSMutableArray *sqlMarr = [[NSMutableArray alloc] init];
- FMResultSet *rs;
- NSString *myID = _gMyObjectID;
- //sql语句
- NSString *sqlCode = [NSString stringWithFormat:@"select * from UserTalk where (Tsend_uid='%@' and Treceive_uid='%@' and Fuserid = '%@' and UGroupId='%@') or (Tsend_uid='%@' and Treceive_uid='%@' and Fuserid = '%@' and UGroupId='%@') order by Taddtime Desc",myID,_gObjectID,_gUserid,@"0",_gObjectID,myID,_gUserid,@"0"];
-
- PTDBManage* manager = [[PTDBManage alloc] init];
- rs = [[manager startDB] executeQuery:sqlCode];
- //判断结果集中是否有数据,如果有则取出数据
- while ([rs next]) {
- NSMutableDictionary *tempdict = [[NSMutableDictionary alloc] init];
- [tempdict setObject:[NSString stringWithFormat:@"%d",[rs intForColumn:@"Tid"]] forKey:@"id"];
- [tempdict setObject:[NSString stringWithFormat:@"%d",[rs intForColumn:@"Ttype"]] forKey:@"type"];
- [tempdict setObject:[rs stringForColumn:@"Tsend_uid"] forKey:@"send_uid"];
- [tempdict setObject:[rs stringForColumn:@"Tsend_uname"] forKey:@"send_uname"];
- [tempdict setObject:[rs stringForColumn:@"Treceive_uid"] forKey:@"receive_uid"];
- [tempdict setObject:[NSString stringWithFormat:@"%d",[rs intForColumn:@"Fuserid"]] forKey:@"userid"];
- //转换为特殊字符
- NSString *strContent = [rs stringForColumn:@"Tcontent"];
- [tempdict setObject:strContent forKey:@"content"];
- [tempdict setObject:[NSString stringWithFormat:@"%d",[rs intForColumn:@"Taddtime"]] forKey:@"addtime"];
- [tempdict setObject:[NSString stringWithFormat:@"%d",[rs intForColumn:@"Trectime"]] forKey:@"rectime"];
- [tempdict setObject:[NSString stringWithFormat:@"%d",[rs intForColumn:@"Tsend"]] forKey:@"send"];
- [tempdict setObject:[NSString stringWithFormat:@"%d",[rs intForColumn:@"TfileInfo"]] forKey:@"fileinfo"];
- [tempdict setObject:[NSString stringWithFormat:@"%d",[[rs stringForColumn:@"UGroupId"] integerValue]] forKey:@"groupid"];
- [tempdict setObject:[rs stringForColumn:@"UGroupName"] forKey:@"groupname"];
-
- //将查询到的数据放入数组中。
- [sqlMarr addObject:tempdict];
- }
- [rs close];
- [manager endDB];
-
- //点击查看更多
- NSInteger tempInt = 15*_leftPageNum;
- if([sqlMarr count] > tempInt ){
- self.gMessageInfo = [[sqlMarr subarrayWithRange:NSMakeRange(0, tempInt)] mutableCopy];
- //点击加载更多
- [self startLoadingAction];
- }else{
- //加载完成
- self.gMessageInfo = sqlMarr;
- [self stopLoadingAction];
- }
- if(self.gMessageInfo.count < 15){
- [_gProcessTV.tableFooterView setHidden:YES];
- }else{
- [_gProcessTV.tableFooterView setHidden:NO];
- }
-
- //5分钟内时间清空
- for (int i = self.gMessageInfo.count-1; i >= 0; i --) {
- NSDictionary *idict = [self.gMessageInfo objectAtIndex:i];
- NSString *iaddtime = [idict objectForKey:@"addtime"];
- NSInteger oldtime = [iaddtime integerValue];
-
- for (int j = i-1 ; j >= 0 ; j --) {
- NSDictionary *jdict = [self.gMessageInfo objectAtIndex:j];
- NSString *jaddtime = [jdict objectForKey:@"addtime"];
- NSInteger newtime = [jaddtime integerValue];
- if((oldtime-newtime)>300 || (newtime-oldtime)>300){
-
- }else{
- [jdict setValue:@"" forKey:@"addtime"];
- }
- }
- }
- }
-
- //TV
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
- static NSString *cellIdentifier=@"GroupMessageCell";
- GroupMessageCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
- [cell releaseAction];
- if (!cell) {
- cell = (GroupMessageCell*)[[[NSBundle mainBundle] loadNibNamed:@"GroupMessageCell" owner:nil options:nil] objectAtIndex:0];
- cell.backgroundColor=[UIColor clearColor];
- cell.selectionStyle = UITableViewCellSelectionStyleNone;
- }
- float cellHeight = [tableView rectForRowAtIndexPath:indexPath].size.height;
- NSDictionary *cellDict = (NSDictionary *)[self.gMessageInfo objectAtIndex:indexPath.row];
- if(cellDict){
- BOOL result = NO;
- if([[cellDict objectForKey:@"send_uid"] isEqualToString:_gMyObjectID]){
- result = YES;
- }
- //文本
- if([[cellDict objectForKey:@"type"] intValue] == 1){
- [cell cProcessMessageTime:[self cAcquireNowTime:[cellDict objectForKey:@"addtime"] ] andInfo:[cellDict objectForKey:@"content"] andIsMy:result andInfoHeight:cellHeight andSend:[cellDict objectForKey:@"send"] andTalkID:_gObjectID andSendName:[cellDict objectForKey:@"send_uname"]];
-
- //图片
- }else if ([[cellDict objectForKey:@"type"] intValue] == 2){
-
- [cell cProcessMessageTime:[self cAcquireNowTime:[cellDict objectForKey:@"addtime"] ] andPicture:[cellDict objectForKey:@"content"] andIsMy:result andInfoHeight:cellHeight andSend:[cellDict objectForKey:@"send"] andTalkID:_gObjectID andSendName:[cellDict objectForKey:@"send_uname"]];
-
- //语音
- }else if([[cellDict objectForKey:@"type"] intValue] == 3){
- [cell cProcessMessageTime:[self cAcquireNowTime:[cellDict objectForKey:@"addtime"] ] andVoicePath:[cellDict objectForKey:@"content"] andIsMy:result andInfoHeight:cellHeight andSend:[cellDict objectForKey:@"send"] andTalkID:_gObjectID andSendName:[cellDict objectForKey:@"send_uname"] andFileInfo:[[cellDict objectForKey:@"fileinfo"] intValue]];
- }else{
- [cell hidnViewAction];
- }
- }
- [cell setTransform:CGAffineTransformMakeRotation(M_PI)];
- return cell;
-
- }
-
- #pragma mark UITableViewDelegate
- - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
- float returnHeight = 44;
- if([self.gMessageInfo count]<15){
- NSDictionary *cellDict = (NSDictionary *)[self.gMessageInfo objectAtIndex:indexPath.row];
- if(cellDict){
- if ([[cellDict objectForKey:@"type"] intValue] == 2){
- UIImage *teImg = [UIImage imageWithContentsOfFile:[cellDict objectForKey:@"content"]];
- UIImage *tempImg = teImg;
- if(tempImg.size.height > 100){
- returnHeight = 100+50;
- }else{
- returnHeight = tempImg.size.height;
- if(returnHeight<50){
- returnHeight = 50+50;
- }else{
- returnHeight = returnHeight +50;
- }
- }
- //语音
- }else if([[cellDict objectForKey:@"type"] intValue] == 3){
- returnHeight = 20+50;
- }//文本
- else{
- NSString *tempStr = [cellDict objectForKey:@"content"];
- //原因是从XML中读取出来的"\n",系统认为是字符串,会默认转换为"\\n",所以当显示的时候就是字符串了,要想显示换行,需要自己手动将"\\n"转换为"\n",这样才能换行.
- NSString*b =[tempStr stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];
- CGRect tempFrame = [self cAdaptCellHeight:b];
- returnHeight = tempFrame.size.height+50;
- }
- }else{
- }
- [self.gCellHeightArr addObject:[NSNumber numberWithFloat:returnHeight]];
- }else{
- NSDictionary *cellDict = (NSDictionary *)[self.gMessageInfo objectAtIndex:indexPath.row];
- if(cellDict){
- if ([[cellDict objectForKey:@"type"] intValue] == 2){
- UIImage *teImg = [UIImage imageWithContentsOfFile:[cellDict objectForKey:@"content"]];
- UIImage *tempImg = teImg;
- if(tempImg.size.height > 100){
- returnHeight = 100+50;
- }else{
- returnHeight = tempImg.size.height;
- if(returnHeight<50){
- returnHeight = 50+50;
- }else{
- returnHeight = returnHeight +50;
- }
- }
- //语音
- }else if([[cellDict objectForKey:@"type"] intValue] == 3){
- returnHeight = 20+50;
- //文本
- }else{
- NSString *tempStr = [cellDict objectForKey:@"content"];
- NSString*b =[tempStr stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];
- CGRect tempFrame = [self cAdaptCellHeight:b];
- returnHeight = tempFrame.size.height+50;
- }
- }else{
- }
- [self.gCellHeightArr addObject:[NSNumber numberWithFloat:returnHeight]];
- }
- returnHeight = returnHeight + 15;
- return returnHeight;
- }
-
- //正在加载
- - (IBAction)loadingMoreAction:(id)sender {
- [_tapLoadBut setTitle:@"点击加载更多" forState:UIControlStateNormal];
- [_tapLoadBut setHidden:YES];
- [_loadingView setHidden:NO];
- _leftPageNum = _leftPageNum + 1;
- [_gProcessTV reloadData];
-
- }
- //点击加载更多
- -(void)startLoadingAction{
- [_tapLoadBut setTitle:@"点击加载更多" forState:UIControlStateNormal];
- [_tapLoadBut setUserInteractionEnabled:YES];
- [_tapLoadBut setHidden:NO];
- [_loadingView setHidden:YES];
- }
- //加载完成
- -(void)stopLoadingAction{
- [_tapLoadBut setTitle:@"加载完成" forState:UIControlStateNormal];
- [_tapLoadBut setUserInteractionEnabled:NO];
- [_tapLoadBut setHidden:NO];
- [_loadingView setHidden:YES];
- }
-
- //判断字符串不全为空
- -(BOOL)judgeStringIsNull:(NSString *)string{
- BOOL result = NO;
- if(string != nil && string.length > 0){
- for (int i = 0; i < string.length; i ++) {
- NSString *subStr = [string substringWithRange:NSMakeRange(i, 1)];
- if(![subStr isEqualToString:@" "] && ![subStr isEqualToString:@""]){
- result = YES;
- }
- }
- }
- return result;
- }
-
- //当前时间的时间戳
- -(long int)cNowTimestamp{
- NSDate *newDate = [NSDate date];
- long int timeSp = (long)[newDate timeIntervalSince1970];
- return timeSp;
- }
-
- - (NSString*)getUserMessagePictureFileSavePath{
- NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Message"];
- NSString *filePath = [path stringByAppendingPathComponent:@"Pictures"];
- if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
- [[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
- }
- return filePath;
- }
- - (NSString*)getUserMessageAudioFileSavePath{
- NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Message"];
- NSString *filePath = [path stringByAppendingPathComponent:@"Audios"];
- if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
- [[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
- }
- return filePath;
- }
-
- - (NSString *)fetchSystemVersion{
- return [[UIDevice currentDevice] systemVersion];
- }
-
- @end
-

示图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。