@@ -93,7 +93,8 @@ static NSString *const kCommentFooterIdentifier = @"CommentFooter";
[ self . inputView mas_makeConstraints : ^ ( MASConstraintMaker * make ) {
make . left . right . equalTo ( self ) ;
make . height . mas_equalTo ( 50 ) ;
self . inputBottomConstraint = make . bottom . equalTo ( self ) . offset ( - KB_SafeAreaBottom ( ) ) ;
self . inputBottomConstraint =
make . bottom . equalTo ( self ) . offset ( - KB_SafeAreaBottom ( ) ) ;
} ] ;
[ self . tableView mas_makeConstraints : ^ ( MASConstraintMaker * make ) {
@@ -148,7 +149,8 @@ static NSString *const kCommentFooterIdentifier = @"CommentFooter";
[ self . inputBottomConstraint uninstall ] ;
[ self . inputView mas_updateConstraints : ^ ( MASConstraintMaker * make ) {
self . inputBottomConstraint = make . bottom . equalTo ( self ) ;
self . inputBottomConstraint =
make . bottom . equalTo ( self ) . offset ( - KB_SafeAreaBottom ( ) ) ;
} ] ;
[ UIView animateWithDuration : duration
@@ -186,20 +188,22 @@ static NSString *const kCommentFooterIdentifier = @"CommentFooter";
NSArray * commentsArray = json [ @ "comments" ] ;
[ self . comments removeAllObjects ] ;
// 获 取 tableView 宽 度 用 于 计 算 高 度
CGFloat tableWidth = self . tableView . bounds . size . width ;
if ( tableWidth <= 0 ) {
tableWidth = [ UIScreen mainScreen ] . bounds . size . width ;
}
for ( NSDictionary * dict in commentsArray ) {
KBAICommentModel * comment = [ KBAICommentModel mj_objectWithKeyValues : dict ] ;
// 预 先 计 算 并 缓 存 Header 高 度
comment . cachedHeaderHeight = [ comment calculateHeaderHeightWithMaxWidth : tableWidth ] ;
comment . cachedHeaderHeight =
[ comment calculateHeaderHeightWithMaxWidth : tableWidth ] ;
// 预 先 计 算 并 缓 存 所 有 Reply 高 度
for ( KBAIReplyModel * reply in comment . replies ) {
reply . cachedCellHeight = [ reply calculateCellHeightWithMaxWidth : tableWidth ] ;
reply . cachedCellHeight =
[ reply calculateCellHeightWithMaxWidth : tableWidth ] ;
}
[ self . comments addObject : comment ] ;
}
@@ -250,7 +254,7 @@ static NSString *const kCommentFooterIdentifier = @"CommentFooter";
[ weakSelf . tableView reloadRowsAtIndexPaths : @ [ indexPath ]
withRowAnimation : UITableViewRowAnimationNone ] ;
} ;
cell . onReplyAction = ^ {
[ weakSelf setReplyToComment : comment reply : reply ] ;
} ;
@@ -276,7 +280,7 @@ static NSString *const kCommentFooterIdentifier = @"CommentFooter";
[ weakSelf . tableView reloadSections : [ NSIndexSet indexSetWithIndex : section ]
withRowAnimation : UITableViewRowAnimationNone ] ;
} ;
header . onReplyAction = ^ {
[ weakSelf setReplyToComment : comment reply : nil ] ;
} ;
@@ -357,17 +361,18 @@ static NSInteger const kRepliesLoadCount = 5;
- ( void ) loadMoreRepliesForSection : ( NSInteger ) section {
KBAICommentModel * comment = self . comments [ section ] ;
NSInteger currentCount = comment . displayedReplies . count ;
// 加 载 更 多 回 复
[ comment loadMoreReplies : kRepliesLoadCount ] ;
// 计 算 新 增 的 行
NSInteger newCount = comment . displayedReplies . count ;
NSMutableArray * insertIndexPaths = [ NSMutableArray array ] ;
for ( NSInteger i = currentCount ; i < newCount ; i + + ) {
[ insertIndexPaths addObject : [ NSIndexPath indexPathForRow : i inSection : section ] ] ;
[ insertIndexPaths addObject : [ NSIndexPath indexPathForRow : i
inSection : section ] ] ;
}
// 插 入 行 ( 不 刷 新 Header , 避 免 头 像 闪 烁 )
[ self . tableView beginUpdates ] ;
if ( insertIndexPaths . count > 0 ) {
@@ -375,7 +380,7 @@ static NSInteger const kRepliesLoadCount = 5;
withRowAnimation : UITableViewRowAnimationAutomatic ] ;
}
[ self . tableView endUpdates ] ;
// 手 动 刷 新 Footer
KBAICommentFooterView * footerView =
( KBAICommentFooterView * ) [ self . tableView footerViewForSection : section ] ;
@@ -387,16 +392,17 @@ static NSInteger const kRepliesLoadCount = 5;
- ( void ) collapseRepliesForSection : ( NSInteger ) section {
KBAICommentModel * comment = self . comments [ section ] ;
NSInteger rowCount = comment . displayedReplies . count ;
// 计 算 要 删 除 的 行
NSMutableArray * deleteIndexPaths = [ NSMutableArray array ] ;
for ( NSInteger i = 0 ; i < rowCount ; i + + ) {
[ deleteIndexPaths addObject : [ NSIndexPath indexPathForRow : i inSection : section ] ] ;
[ deleteIndexPaths addObject : [ NSIndexPath indexPathForRow : i
inSection : section ] ] ;
}
// 收 起 全 部 回 复
[ comment collapseReplies ] ;
// 删 除 行 ( 不 刷 新 Header , 避 免 头 像 闪 烁 )
[ self . tableView beginUpdates ] ;
if ( deleteIndexPaths . count > 0 ) {
@@ -404,7 +410,7 @@ static NSInteger const kRepliesLoadCount = 5;
withRowAnimation : UITableViewRowAnimationAutomatic ] ;
}
[ self . tableView endUpdates ] ;
// 手 动 刷 新 Footer
KBAICommentFooterView * footerView =
( KBAICommentFooterView * ) [ self . tableView footerViewForSection : section ] ;
@@ -458,7 +464,7 @@ static NSInteger const kRepliesLoadCount = 5;
- ( BaseTableView * ) tableView {
if ( ! _tableView ) {
_tableView = [ [ BaseTableView alloc ] initWithFrame : CGRectZero
style : UITableViewStyleGrouped ] ;
style : UITableViewStyleGrouped ] ;
_tableView . dataSource = self ;
_tableView . delegate = self ;
_tableView . backgroundColor = [ UIColor whiteColor ] ;
@@ -496,20 +502,26 @@ static NSInteger const kRepliesLoadCount = 5;
# pragma mark - Reply
- ( void ) setReplyToComment : ( KBAICommentModel * ) comment reply : ( KBAIReplyModel * ) reply {
- ( void ) setReplyToComment : ( KBAICommentModel * ) comment
reply : ( KBAIReplyModel * ) reply {
self . replyToComment = comment ;
self . replyToReply = reply ;
if ( reply ) {
// 回 复 二 级 评 论
self . inputView . placeholder = [ NSString stringWithFormat : @ "回复 @%@" , reply . userName ] ;
self . inputView . placeholder =
[ NSString stringWithFormat : @ "回复 @%@" , reply . userName ] ;
} else if ( comment ) {
// 回 复 一 级 评 论
self . inputView . placeholder = [ NSString stringWithFormat : @ "回复 @%@" , comment . userName ] ;
self . inputView . placeholder =
[ NSString stringWithFormat : @ "回复 @%@" , comment . userName ] ;
} else {
// 普 通 评 论
self . inputView . placeholder = @ "说点什么..." ;
}
// 弹 起 键 盘
[ self . inputView showKeyboard ] ;
}
- ( void ) clearReplyTarget {
@@ -521,13 +533,14 @@ static NSInteger const kRepliesLoadCount = 5;
# pragma mark - Send Comment
- ( void ) sendCommentWithText : ( NSString * ) text {
if ( text . length = = 0 ) return ;
if ( text . length = = 0 )
return ;
CGFloat tableWidth = self . tableView . bounds . size . width ;
if ( tableWidth <= 0 ) {
tableWidth = [ UIScreen mainScreen ] . bounds . size . width ;
}
if ( self . replyToComment ) {
// 回 复 评 论 ( 添 加 二 级 评 论 )
[ self sendReplyWithText : text tableWidth : tableWidth ] ;
@@ -535,7 +548,7 @@ static NSInteger const kRepliesLoadCount = 5;
// 发 送 一 级 评 论
[ self sendNewCommentWithText : text tableWidth : tableWidth ] ;
}
// 清 空 输 入 框 和 回 复 目 标
[ self . inputView clearText ] ;
[ self clearReplyTarget ] ;
@@ -553,27 +566,29 @@ static NSInteger const kRepliesLoadCount = 5;
newComment . isLiked = NO ;
newComment . createTime = [ [ NSDate date ] timeIntervalSince1970 ] ;
newComment . replies = @ [ ] ;
// 计 算 高 度 缓 存
newComment . cachedHeaderHeight = [ newComment calculateHeaderHeightWithMaxWidth : tableWidth ] ;
newComment . cachedHeaderHeight =
[ newComment calculateHeaderHeightWithMaxWidth : tableWidth ] ;
// 插 入 到 数 组 第 一 个
[ self . comments insertObject : newComment atIndex : 0 ] ;
self . totalCommentCount + + ;
[ self updateTitle ] ;
// 插 入 新 section
[ self . tableView insertSections : [ NSIndexSet indexSetWithIndex : 0 ]
withRowAnimation : UITableViewRowAnimationAutomatic ] ;
// 滚 动 到 顶 部
[ self . tableView setContentOffset : CGPointZero animated : YES ] ;
}
- ( void ) sendReplyWithText : ( NSString * ) text tableWidth : ( CGFloat ) tableWidth {
KBAICommentModel * comment = self . replyToComment ;
if ( ! comment ) return ;
if ( ! comment )
return ;
// 创 建 新 二 级 评 论
KBAIReplyModel * newReply = [ [ KBAIReplyModel alloc ] init ] ;
newReply . replyId = [ NSUUID UUID ] . UUIDString ;
@@ -584,41 +599,44 @@ static NSInteger const kRepliesLoadCount = 5;
newReply . likeCount = 0 ;
newReply . isLiked = NO ;
newReply . createTime = [ [ NSDate date ] timeIntervalSince1970 ] ;
// 如 果 是 回 复 二 级 评 论 , 设 置 被 回 复 用 户
if ( self . replyToReply ) {
newReply . replyToUserName = self . replyToReply . userName ;
}
// 计 算 高 度 缓 存
newReply . cachedCellHeight = [ newReply calculateCellHeightWithMaxWidth : tableWidth ] ;
newReply . cachedCellHeight =
[ newReply calculateCellHeightWithMaxWidth : tableWidth ] ;
// 添 加 到 replies 数 组
NSMutableArray * newReplies = [ NSMutableArray arrayWithArray : comment . replies ] ;
[ newReplies addObject : newReply ] ;
comment . replies = newReplies ;
comment . totalReplyCount = newReplies . count ;
// 找 到 该 评 论 的 section
NSInteger section = [ self . comments indexOfObject : comment ] ;
if ( section = = NSNotFound ) return ;
if ( section = = NSNotFound )
return ;
// 如 果 已 展 开 , 添 加 到 displayedReplies 并 插 入 行
if ( comment . isRepliesExpanded ) {
NSInteger newRowIndex = comment . displayedReplies . count ;
[ comment . displayedReplies addObject : newReply ] ;
NSIndexPath * indexPath = [ NSIndexPath indexPathForRow : newRowIndex inSection : section ] ;
[ self . tableView insertRowsAtIndexPaths : @ [ indexPath ]
NSIndexPath * indexPath = [ NSIndexPath indexPathForRow : newRowIndex
inSection : section ] ;
[ self . tableView insertRowsAtIndexPaths : @ [ indexPath ]
withRowAnimation : UITableViewRowAnimationAutomatic ] ;
// 刷 新 Footer
KBAICommentFooterView * footerView =
( KBAICommentFooterView * ) [ self . tableView footerViewForSection : section ] ;
if ( footerView ) {
[ footerView configureWithComment : comment ] ;
}
// 滚 动 到 新 回 复
[ self . tableView scrollToRowAtIndexPath : indexPath
atScrollPosition : UITableViewScrollPositionBottom