Files
real-e-party-iOS/YuMi/Modules/YMMonents/Presenter/XPMomentsLayoutConfig.m
edwinQQQ a35a711be6 chore: Initial clean commit
- Removed YuMi/Library/ (138 MB, not tracked)
- Removed YuMi/Resources/ (23 MB, not tracked)
- Removed old version assets (566 files, not tracked)
- Excluded Pods/, xcuserdata/ and other build artifacts
- Clean repository optimized for company server deployment
2025-10-09 16:19:14 +08:00

318 lines
12 KiB
Objective-C

//
// YMMonentsLayoutConfig.m
// YUMI
//
// Created by YUMI on 2022/5/12.
//
#import "XPMomentsLayoutConfig.h"
#import "DJDKMIMOMColor.h"
///Model
#import "MomentsInfoModel.h"
#import "MonentsCommentModel.h"
#import "QEmotionHelper.h"
@implementation XPMomentsLayoutConfig
#pragma mark - 审核的布局
+ (void)getNewLayoutMomentsModelWithDynamic:(MomentsInfoModel *)moments {
CGFloat rowHeight = 10;
///用户信息和文字之间的间隙
rowHeight += kMOMENTS_CONTENT_SPACAE_HEIGHT;
///文字内容的高度
rowHeight += [self momentsContentHeight:moments];
///图片的高度
rowHeight += [self getNewMomentsPicHeight:moments];
///如果没有图片的话 间隙就只有一个
if (moments.type == MomentsContentType_Picture && moments.content.length > 0) {
rowHeight += (kMOMENTS_CONTENT_SPACAE_HEIGHT);
}
///话题的高度
if (moments.worldId > 0) {
rowHeight += kMOMENTS_TEXT_TOPIC_HEIGHT;
}
///底部操作栏的高度
rowHeight += kMOMENTS_TOOL_BAR_HEIGHT;
moments.rowHeight = rowHeight;
}
+ (CGFloat)getNewMomentsPicHeight:(MomentsInfoModel *)moments {
///计算图片的高度
NSInteger picCount = moments.dynamicResList.count;
CGFloat picHeight = 0;
CGFloat width = KScreenWidth-27*2;
if (picCount == 0) {
picHeight = 0;
} else if(picCount == 1) {
picHeight = width;
} else if(picCount == 2) {
picHeight = (width - kMOMENTS_PIC_SPACE) / 2;
} else {
if (picCount > 9) {
picCount = 9;
}
CGFloat itemWidth = (width - kMOMENTS_PIC_SPACE * 2) / 3;
NSInteger page = picCount % 3;
NSInteger line = picCount / 3;
if (page == 0) {
picHeight = itemWidth * line + (line -1)* kMOMENTS_PIC_SPACE;
} else {
picHeight = itemWidth * (line +1) + line * kMOMENTS_PIC_SPACE;
}
}
moments.picHeight = picHeight;
return picHeight;
}
+ (void)layoutMonentsModelWithDynamic:(MomentsInfoModel *)moments {
CGFloat rowHeight = 10;
///用户信息和文字之间的间隙
rowHeight += kMOMENTS_CONTENT_SPACAE_HEIGHT;
///文字内容的高度
rowHeight += [self momentsContentHeight:moments];
///图片的高度
rowHeight += [self momentsPicHeight:moments];
///如果没有图片的话 间隙就只有一个
if (moments.type == MomentsContentType_Picture && moments.content.length > 0) {
rowHeight += (kMOMENTS_CONTENT_SPACAE_HEIGHT);
}
///话题的高度
if (moments.worldId > 0) {
rowHeight += kMOMENTS_TEXT_TOPIC_HEIGHT;
}
///底部操作栏的高度
rowHeight += kMOMENTS_TOOL_BAR_HEIGHT;
moments.rowHeight = rowHeight;
}
+ (void)layoutSimpleMomentsModel:(MomentsInfoModel *)moments {
CGFloat rowHeight = kMOMENTS_CONTENT_SPACAE_HEIGHT;
///文字内容的高度
rowHeight += [self simpleMomentsContentHeight:moments];
///图片的高度
rowHeight += [self momentsPicHeight:moments];
///如果没有图片的话 间隙就只有一个
if (moments.type == MomentsContentType_Picture && moments.content.length > 0) {
rowHeight += (kMOMENTS_CONTENT_SPACAE_HEIGHT * 2);
}else {
rowHeight += kMOMENTS_CONTENT_SPACAE_HEIGHT;
}
///话题的高度
rowHeight += kMOMENTS_TEXT_TOPIC_HEIGHT;
moments.rowHeight = rowHeight;
}
+ (CGFloat)simpleMomentsContentHeight:(MomentsInfoModel *)moments {
if (moments.content.length <= 0) {
moments.contentHeight = 0;
return 0;
}
///计算文本的高度
if (!moments.contentAttribute) {
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init];
if (moments.squareTop ) {//动态/广场
NSTextAttachment * attachment = [[NSTextAttachment alloc] init];
attachment.bounds = CGRectMake(0, 0, 25 * 1.3 ,10 * 1.3);
attachment.image = [UIImage getLanguageImage:@"monents_info_top"];
NSAttributedString * starAttribute = [NSMutableAttributedString attributedStringWithAttachment:(NSTextAttachment *)attachment];
[attributedString insertAttributedString:starAttribute atIndex:0];
}
[attributedString appendAttributedString:[self creatStrAttrByStr:moments.content attributed:@{NSFontAttributeName : [UIFont systemFontOfSize:15]}]];
attributedString.yy_lineSpacing = 5;
attributedString.yy_lineBreakMode = NSLineBreakByWordWrapping;
moments.contentAttribute = attributedString;
}
YYTextContainer *container = [YYTextContainer new];
container.size = CGSizeMake(kSIMPLE_MOMENTS_CONTENT_MAX_WIDTH, CGFLOAT_MAX);
container.maximumNumberOfRows = 0;
YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:moments.contentAttribute];
moments.numberOfText = layout.rowCount;
CGFloat foldHeight = 0;
if (layout.rowCount > 6) {
foldHeight = kMOMENTS_FOLD_HEIGHT;
NSInteger numberOfLines = moments.isFold ? 6 : 0;
container.maximumNumberOfRows = numberOfLines;
}
YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:moments.contentAttribute];
CGFloat contentHeight = realLayout.textBoundingSize.height;
moments.contentHeight =contentHeight;
return contentHeight + foldHeight;
}
+ (CGFloat)simpleMonentsPicHeight:(MomentsInfoModel *)moments {
///计算图片的高度
NSInteger picCount = moments.dynamicResList.count;
CGFloat picHeight = 0;
if (picCount == 0) {
picHeight = 0;
} else if(picCount == 1) {
picHeight = kMOMENTS_PIC_ONE_WIDTH;
} else if(picCount == 2) {
picHeight = (kSIMPLE_MOMENTS_CONTENT_MAX_WIDTH - kMOMENTS_PIC_SPACE) / 2;
} else {
if (picCount > 9) {
picCount = 9;
}
CGFloat itemWidth = (kSIMPLE_MOMENTS_CONTENT_MAX_WIDTH - kMOMENTS_PIC_SPACE * 2) / 3;
NSInteger page = picCount % 3;
NSInteger line = picCount / 3;
if (page == 0) {
picHeight = itemWidth * line + (line -1)* kMOMENTS_PIC_SPACE;
} else {
picHeight = itemWidth * (line +1) + line * kMOMENTS_PIC_SPACE;
}
}
moments.picHeight = picHeight;
return picHeight;
}
#pragma mark - 正常的布局
+ (void)layoutMomentsModel:(MomentsInfoModel *)moments {
CGFloat rowHeight = kMOMENTS_USER_INFO_HEIGHT;
///用户信息和文字之间的间隙
rowHeight += kMOMENTS_CONTENT_SPACAE_HEIGHT;
///文字内容的高度
rowHeight += [self momentsContentHeight:moments];
///图片的高度
rowHeight += [self momentsPicHeight:moments];
///如果没有图片的话 间隙就只有一个
if (moments.type == MomentsContentType_Picture && moments.content.length > 0) {
rowHeight += (kMOMENTS_CONTENT_SPACAE_HEIGHT * 2);
}else {
rowHeight += kMOMENTS_CONTENT_SPACAE_HEIGHT;
}
///话题的高度
rowHeight += kMOMENTS_TEXT_TOPIC_HEIGHT;
///底部操作栏的高度
rowHeight += kMOMENTS_TOOL_BAR_HEIGHT;
moments.rowHeight = rowHeight;
}
+ (CGFloat)momentsPicHeight:(MomentsInfoModel *)moments {
///计算图片的高度
NSInteger picCount = moments.dynamicResList.count;
CGFloat picHeight = 0;
if (picCount == 0) {
picHeight = 0;
} else if(picCount == 1) {
picHeight = kMOMENTS_PIC_ONE_WIDTH;
} else if(picCount == 2) {
picHeight = (kMONENTS_CONTENT_MAX_WIDTH - kMOMENTS_PIC_SPACE) / 2;
} else {
if (picCount > 9) {
picCount = 9;
}
CGFloat itemWidth = (kMONENTS_CONTENT_MAX_WIDTH - kMOMENTS_PIC_SPACE * 2) / 3;
NSInteger page = picCount % 3;
NSInteger line = picCount / 3;
if (page == 0) {
picHeight = itemWidth * line + (line -1)* kMOMENTS_PIC_SPACE;
} else {
picHeight = itemWidth * (line +1) + line * kMOMENTS_PIC_SPACE;
}
}
moments.picHeight = picHeight;
return picHeight;
}
+ (CGFloat)momentsContentHeight:(MomentsInfoModel *)moments {
if (moments.content.length <= 0) {
moments.contentHeight = 0;
return 0;
}
///计算文本的高度
if (!moments.contentAttribute) {
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init];
if (moments.squareTop ) {//动态/广场
NSTextAttachment * attachment = [[NSTextAttachment alloc] init];
attachment.bounds = CGRectMake(0, 0, 25 * 1.3 ,10 * 1.3);
attachment.image = [UIImage getLanguageImage:@"monents_info_top"];
NSAttributedString * starAttribute = [NSMutableAttributedString attributedStringWithAttachment:(NSTextAttachment *)attachment];
[attributedString insertAttributedString:starAttribute atIndex:0];
}
[attributedString appendAttributedString:[self creatStrAttrByStr:moments.content attributed:@{NSFontAttributeName : [UIFont systemFontOfSize:15]}]];
attributedString.yy_lineSpacing = 5;
attributedString.yy_lineBreakMode = NSLineBreakByWordWrapping;
moments.contentAttribute = attributedString;
}
YYTextContainer *container = [YYTextContainer new];
container.size = CGSizeMake(kMONENTS_CONTENT_MAX_WIDTH, CGFLOAT_MAX);
container.maximumNumberOfRows = 0;
YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:moments.contentAttribute];
moments.numberOfText = layout.rowCount;
CGFloat foldHeight = 0;
if (layout.rowCount > 6) {
foldHeight = kMOMENTS_FOLD_HEIGHT;
NSInteger numberOfLines = moments.isFold ? 6 : 0;
container.maximumNumberOfRows = numberOfLines;
}
YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:moments.contentAttribute];
CGFloat contentHeight = realLayout.textBoundingSize.height;
moments.contentHeight =contentHeight;
return contentHeight + foldHeight;
}
+ (NSMutableAttributedString *)creatStrAttrByStr:(NSString *)str attributed:(NSDictionary *)attribute{
if (str.length == 0 || !str) {
str = @" ";
}
NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:str attributes:attribute];
return attr;
}
///计算评论的高度
+ (CGFloat)commentCommentRowHeight:(MonentsCommentModel * )comment {
if (comment.commentRowHeight > 0 && !comment.isReloadHeight) {
return comment.commentRowHeight;
}
__block CGFloat rowHeight = 0;
CGFloat commentTopHeight = 10 + 15 + 10;///10顶部的间隙 15 昵称的高度
///内容
QEmotionHelper *faceManager = [QEmotionHelper sharedEmotionHelper];
NSMutableAttributedString * attribute = [faceManager attributedStringByText:comment.content font:[UIFont systemFontOfSize:15]];
YYTextContainer *container = [YYTextContainer new];
container.size = CGSizeMake(kMOMENTS_COMMENT_REPLY_MAX_WIDTH, CGFLOAT_MAX);
container.maximumNumberOfRows = 0;
YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:attribute];
CGFloat commentHeight = realLayout.textBoundingSize.height;
commentHeight = MAX(commentHeight, 15);
rowHeight += commentTopHeight;
rowHeight += commentHeight;
///展开剩余的回复
if (comment.replyInfo.leftCount > 0) {
rowHeight += 44;
}
if (comment.replyInfo.replyList.count > 0) {
rowHeight += 10 * 2;
} else {
rowHeight += 10;
}
///评论的高度
[comment.replyInfo.replyList enumerateObjectsUsingBlock:^(MonentsReplyModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.content.length > 0) {
[obj createContentAttribute];
CGFloat replayHeight = 0;
CGFloat commentTopHeight = 10 + 15 + 10;///10顶部的间隙 15 昵称的高度
CGFloat commentBottomHeight = 10;
YYTextContainer *container = [YYTextContainer new];
container.size = CGSizeMake(kMOMENTS_COMMENT_REPLY_MAX_WIDTH, CGFLOAT_MAX);
container.maximumNumberOfRows = 0;
YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:obj.contentAttribute];
CGFloat replyContentHeight = realLayout.textBoundingSize.height;
replayHeight += commentTopHeight;
replayHeight += replyContentHeight;
replayHeight += commentBottomHeight;
obj.replyRowHeight = replayHeight;
rowHeight += replayHeight;
}
}];
comment.commentRowHeight = rowHeight;
return rowHeight;
}
@end