You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
357 lines
9.9 KiB
357 lines
9.9 KiB
// |
|
// XHMessageTableViewController.h |
|
// MessageDisplayExample |
|
// |
|
// Created by HUAJIE-1 on 14-4-24. |
|
// Copyright (c) 2014年 曾宪华 开发团队(http://iyilunba.com ) 本人QQ:543413507 本人QQ群(142557668). All rights reserved. |
|
// |
|
|
|
#import <UIKit/UIKit.h> |
|
|
|
// Model |
|
#import "XHMessage.h" |
|
|
|
// Views |
|
#import "XHMessageTableView.h" |
|
#import "XHMessageTableViewCell.h" |
|
#import "XHMessageInputView.h" |
|
#import "XHShareMenuView.h" |
|
#import "XHEmotionManagerView.h" |
|
#import "XHVoiceRecordHUD.h" |
|
|
|
// Factory |
|
#import "XHMessageBubbleFactory.h" |
|
#import "XHMessageVideoConverPhotoFactory.h" |
|
|
|
// Helper |
|
#import "XHPhotographyHelper.h" |
|
#import "XHLocationHelper.h" |
|
#import "XHVoiceRecordHelper.h" |
|
|
|
// Categorys |
|
#import "UIScrollView+XHkeyboardControl.h" |
|
|
|
#import "baseViewController.h" |
|
|
|
@protocol XHMessageTableViewControllerDelegate <NSObject> |
|
|
|
@optional |
|
/** |
|
* 发送文本消息的回调方法 |
|
* |
|
* @param text 目标文本字符串 |
|
* @param sender 发送者的名字 |
|
* @param date 发送时间 |
|
*/ |
|
- (void)didSendText:(NSString *)text fromSender:(NSString *)sender onDate:(NSDate *)date; |
|
|
|
/** |
|
* 发送图片消息的回调方法 |
|
* |
|
* @param photo 目标图片对象,后续有可能会换 |
|
* @param sender 发送者的名字 |
|
* @param date 发送时间 |
|
*/ |
|
- (void)didSendPhoto:(UIImage *)photo fromSender:(NSString *)sender onDate:(NSDate *)date; |
|
|
|
/** |
|
* 发送视频消息的回调方法 |
|
* |
|
* @param videoConverPhoto 目标视频的封面图 |
|
* @param videoPath 目标视频本地路径 |
|
* @param sender 发送者的名字 |
|
* @param date 发送时间 |
|
*/ |
|
- (void)didSendVideoConverPhoto:(UIImage *)videoConverPhoto videoPath:(NSString *)videoPath fromSender:(NSString *)sender onDate:(NSDate *)date; |
|
|
|
/** |
|
* 发送语音消息的回调方法 |
|
* |
|
* @param voicePath 目标语音本地路径 |
|
* @param voiceDuration 目标语音时长 |
|
* @param sender 发送者的名字 |
|
* @param date 发送时间 |
|
*/ |
|
- (void)didSendVoice:(NSString *)voicePath voiceDuration:(NSNumber*)voiceDuration fromSender:(NSString *)sender onDate:(NSDate *)date; |
|
|
|
/** |
|
* 发送第三方表情消息的回调方法 |
|
* |
|
* @param emotionPath 目标第三方表情的本地路径 |
|
* @param sender 发送者的名字 |
|
* @param date 发送时间 |
|
*/ |
|
- (void)didSendEmotion:(NSString *)emotionPath fromSender:(NSString *)sender onDate:(NSDate *)date; |
|
|
|
/** |
|
* 发送地理位置的回调方法 |
|
* |
|
* @param geoLocationsPhoto 目标显示默认图 |
|
* @param geolocations 目标地理信息 |
|
* @param location 目标地理经纬度 |
|
* @param sender 发送者 |
|
* @param date 发送时间 |
|
*/ |
|
- (void)didSendGeoLocationsPhoto:(UIImage *)geoLocationsPhoto geolocations:(NSString *)geolocations location:(CLLocation *)location fromSender:(NSString *)sender onDate:(NSDate *)date; |
|
|
|
/** |
|
* 是否显示时间轴Label的回调方法 |
|
* |
|
* @param indexPath 目标消息的位置IndexPath |
|
* |
|
* @return 根据indexPath获取消息的Model的对象,从而判断返回YES or NO来控制是否显示时间轴Label |
|
*/ |
|
- (BOOL)shouldDisplayTimestampForRowAtIndexPath:(NSIndexPath *)indexPath; |
|
|
|
/** |
|
* 配置Cell的样式或者字体 |
|
* |
|
* @param cell 目标Cell |
|
* @param indexPath 目标Cell所在位置IndexPath |
|
*/ |
|
- (void)configureCell:(XHMessageTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath; |
|
|
|
/** |
|
* 协议回掉是否支持用户手动滚动 |
|
* |
|
* @return 返回YES or NO |
|
*/ |
|
- (BOOL)shouldPreventScrollToBottomWhileUserScrolling; |
|
|
|
/** |
|
* 判断是否支持下拉加载更多消息 |
|
* |
|
* @return 返回BOOL值,判定是否拥有这个功能 |
|
*/ |
|
- (BOOL)shouldLoadMoreMessagesScrollToTop; |
|
|
|
/** |
|
* 下拉加载更多消息,只有在支持下拉加载更多消息的情况下才会调用。 |
|
*/ |
|
- (void)loadMoreMessagesScrollTotop; |
|
|
|
/** |
|
* 配置TableViewCell高度的方法,如果你想定制自己的Cell样式,那么你必须要实现DataSource中的方法 |
|
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath targetMessage:(id<XHMessageModel>)message; |
|
* |
|
* @param tableView 目标TableView |
|
* @param indexPath 目标IndexPath |
|
* @param message 目标消息Model |
|
* |
|
* @return 返回计算好的Cell高度 |
|
*/ |
|
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath targetMessage:(XHMessage *)message; |
|
|
|
|
|
- (void)moreButtonClick:(void (^)())PickerMediaBlock; |
|
|
|
@end |
|
|
|
@protocol XHMessageTableViewControllerDataSource <NSObject> |
|
|
|
@required |
|
- (XHMessage *)messageForRowAtIndexPath:(NSIndexPath *)indexPath; |
|
|
|
@optional |
|
/** |
|
* 配置TableViewCell的方法,如果你想定制自己的Cell样式,那么你必须要实现Delegate中的方法 |
|
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath targetMessage:(id<XHMessageModel>)message; |
|
* |
|
* @param tableView 目标TableView |
|
* @param indexPath 目标IndexPath |
|
* @param message 目标消息Model |
|
* |
|
* @return 返回UITableViewCell或者继承于UITableViewCell的实例化对象 |
|
*/ |
|
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath targetMessage:(XHMessage *)message; |
|
|
|
@end |
|
|
|
@interface XHMessageTableViewController : baseViewController <UITableViewDataSource, UITableViewDelegate, XHMessageTableViewControllerDelegate, XHMessageTableViewControllerDataSource, XHMessageInputViewDelegate, XHMessageTableViewCellDelegate, XHShareMenuViewDelegate, XHEmotionManagerViewDelegate, XHEmotionManagerViewDataSource> |
|
|
|
@property (nonatomic, weak) id <XHMessageTableViewControllerDelegate> delegate; |
|
|
|
@property (nonatomic, weak) id <XHMessageTableViewControllerDataSource> msgDataSource; |
|
|
|
@property (nonatomic, assign, readonly) XHInputViewType textViewInputViewType; |
|
|
|
@property (nonatomic, assign) UIActivityIndicatorViewStyle loadMoreActivityIndicatorViewStyle; |
|
|
|
/** |
|
* 数据源,显示多少消息 |
|
*/ |
|
@property (nonatomic, strong) NSMutableArray *messages; |
|
|
|
/** |
|
* 第三方接入的功能,也包括系统自身的功能,比如拍照、发送地理位置 |
|
*/ |
|
@property (nonatomic, strong) NSArray *shareMenuItems; |
|
|
|
/** |
|
* 消息的主体,默认为nil |
|
*/ |
|
@property (nonatomic, copy) NSString *messageSender; |
|
|
|
/** |
|
* 用于显示消息的TableView |
|
*/ |
|
@property (nonatomic, weak, readonly) XHMessageTableView *messageTableView; |
|
|
|
/** |
|
* 用于显示发送消息类型控制的工具条,在底部 |
|
*/ |
|
@property (nonatomic, weak, readonly) XHMessageInputView *messageInputView; |
|
|
|
/** |
|
* 替换键盘的位置的第三方功能控件 |
|
*/ |
|
@property (nonatomic, weak, readonly) XHShareMenuView *shareMenuView; |
|
|
|
|
|
/** |
|
* 管理第三方gif表情的控件 |
|
*/ |
|
@property (nonatomic, weak, readonly) XHEmotionManagerView *emotionManagerView; |
|
|
|
/** |
|
* 是否正在加载更多旧的消息数据 |
|
*/ |
|
@property (nonatomic, assign) BOOL loadingMoreMessage; |
|
|
|
/** |
|
* 管理本机的摄像和图片库的工具对象 |
|
*/ |
|
@property (nonatomic, strong) XHPhotographyHelper *photographyHelper; |
|
|
|
/** |
|
* 管理录音工具对象 |
|
*/ |
|
@property (nonatomic, strong) XHVoiceRecordHelper *voiceRecordHelper; |
|
|
|
/** |
|
* 用于显示的最后消息时间 |
|
*/ |
|
@property (nonatomic, copy) NSNumber *lastShowTimetamp; |
|
|
|
#pragma mark - Message View Controller Default stup |
|
/** |
|
* 是否允许手势关闭键盘,默认是允许 |
|
*/ |
|
@property (nonatomic, assign) BOOL allowsPanToDismissKeyboard; // default is YES |
|
|
|
|
|
/** |
|
* 是否允许发送文字 |
|
*/ |
|
@property (nonatomic, assign) BOOL allowsSendText; // default is YES |
|
/** |
|
* 是否允许发送语音 |
|
*/ |
|
@property (nonatomic, assign) BOOL allowsSendVoice; // default is YES |
|
|
|
/** |
|
* 是否允许发送多媒体 |
|
*/ |
|
@property (nonatomic, assign) BOOL allowsSendMultiMedia; // default is YES |
|
|
|
/** |
|
* 是否支持发送表情 |
|
*/ |
|
@property (nonatomic, assign) BOOL allowsSendFace; // default is NO |
|
|
|
/** |
|
* 输入框的样式,默认为扁平化 |
|
*/ |
|
@property (nonatomic, assign) XHMessageInputViewStyle inputViewStyle; |
|
|
|
|
|
|
|
@property (nonatomic, strong) XHMessageTableViewCell *currentSelectedCell;//xTT 当前cell |
|
|
|
|
|
/// 群聊单聊类型区分 111:单聊 222:群聊 |
|
@property (nonatomic ,assign) NSInteger chatType; |
|
|
|
|
|
#pragma mark - DataSource Change |
|
/** |
|
* 添加一条新的消息 |
|
* |
|
* @param addedMessage 添加的目标消息对象 |
|
*/ |
|
- (void)addMessage:(XHMessage *)addedMessage; |
|
|
|
/** |
|
* 删除一条已存在的消息 |
|
* |
|
* @param indexPath 删除的目标消息对象 |
|
*/ |
|
- (void)removeMessageAtIndexPath:(NSIndexPath *)indexPath; |
|
|
|
/** |
|
* 插入旧消息数据到头部,仿微信的做法 |
|
* |
|
* @param oldMessages 目标的旧消息数据 |
|
*/ |
|
- (void)insertOldMessages:(NSArray *)oldMessages; |
|
|
|
/** |
|
* 同上,增加了 completion 来通知消息插入完毕 |
|
* |
|
* @param oldMessages 目标的旧消息数据 |
|
* @param completion insert 完成回调 |
|
*/ |
|
- (void)insertOldMessages:(NSArray *)oldMessages completion:(void (^)())completion; |
|
|
|
#pragma mark - Messages view controller |
|
/** |
|
* 完成发送消息的函数 |
|
*/ |
|
- (void)finishSendMessageWithBubbleMessageType:(XHBubbleMessageMediaType)mediaType; |
|
|
|
/** |
|
* 设置View、tableView的背景颜色 |
|
* |
|
* @param color 背景颜色 |
|
*/ |
|
- (void)setBackgroundColor:(UIColor *)color; |
|
|
|
/** |
|
* 设置消息列表的背景图片 |
|
* |
|
* @param backgroundImage 目标背景图片 |
|
*/ |
|
- (void)setBackgroundImage:(UIImage *)backgroundImage; |
|
|
|
/** |
|
* 是否滚动到底部 |
|
* |
|
* @param animated YES Or NO |
|
*/ |
|
- (void)scrollToBottomAnimated:(BOOL)animated; |
|
|
|
/** |
|
* 滚动到哪一行 |
|
* |
|
* @param indexPath 目标行数变量 |
|
* @param position UITableViewScrollPosition 整形常亮 |
|
* @param animated 是否滚动动画,YES or NO |
|
*/ |
|
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath |
|
atScrollPosition:(UITableViewScrollPosition)position |
|
animated:(BOOL)animated; |
|
|
|
/** |
|
* 取消录制语音 |
|
*/ |
|
- (void)cancelRecord; |
|
|
|
#pragma mark - Other Menu View Frame Helper Mehtod |
|
/** |
|
* 根据显示或隐藏的需求对所有第三方Menu进行管理 |
|
* |
|
* @param hide 需求条件 |
|
*/ |
|
- (void)layoutOtherMenuViewHiden:(BOOL)hide; |
|
|
|
@end
|
|
|