diff --git a/YuMi/Modules/YMRoom/View/MessageContainerView/Model/XPMessageInfoModel.m b/YuMi/Modules/YMRoom/View/MessageContainerView/Model/XPMessageInfoModel.m index a28a1e15..3efc09fc 100644 --- a/YuMi/Modules/YMRoom/View/MessageContainerView/Model/XPMessageInfoModel.m +++ b/YuMi/Modules/YMRoom/View/MessageContainerView/Model/XPMessageInfoModel.m @@ -38,17 +38,18 @@ self.textLayout = [YYTextLayout layoutWithContainer:container text:content]; CGSize textSize = self.textLayout.textBoundingRect.size; -// CGFloat anotherHeight = [self heightForAttributedStringUsingTextKit:content maxWidth:kRoomMessageMaxWidth]; - self.rowHeight = ceil(textSize.height) + self.contentTopMargin + self.contentBottomMargin + self.cellBottomMargin + 20; - if (![NSString isEmpty:self.bubbleImageUrl]) { - self.rowHeight += 30; - } else { - self.rowHeight += 10; - } +// CGFloat anotherHeight = [self heightForAttributedStringUsingTextKit:content maxWidth:kRoomMessageMaxWidth].height; - if ([self.cellKey isEqualToString:@"ChatMessage"]) { - NSLog(@" ----- 11 ----- %@ : %@", [NSValue valueWithCGSize:textSize], [NSValue valueWithCGSize:[self heightForAttributedStringUsingTextKit:content maxWidth:kRoomMessageMaxWidth]]); + if ([NSString isEmpty:self.bubbleImageUrl]) { + self.rowHeight = ceil(textSize.height) + self.cellBottomMargin + self.contentTopMargin + 20; + } else { + self.rowHeight = ceil(textSize.height) + self.contentTopMargin + self.contentBottomMargin + self.cellBottomMargin + 20; } + self.rowHeight += 10; + +// if ([self.cellKey isEqualToString:@"ChatMessage"]) { +// NSLog(@" ----- 11 ----- %@ : %@", [NSValue valueWithCGSize:textSize], [NSValue valueWithCGSize:[self heightForAttributedStringUsingTextKit:content maxWidth:kRoomMessageMaxWidth]]); +// } // self.rowHeight = [self heightForAttributedText:content // maxWidth:kRoomMessageMaxWidth]; diff --git a/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPNetImageYYLabel.m b/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPNetImageYYLabel.m index 555024b4..7a20ccf6 100644 --- a/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPNetImageYYLabel.m +++ b/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPNetImageYYLabel.m @@ -14,9 +14,9 @@ - (void)setAttributedText:(NSAttributedString *)attributedText { NSMutableAttributedString* attributedTextCopy = [attributedText mutableCopy]; - CGSize maxSize = CGSizeMake(kRoomMessageMaxWidth - 24, MAXFLOAT); - - self.maxWidth = maxSize.width - 8; + + CGSize maxSize = CGSizeMake(kRoomMessageMaxWidth, MAXFLOAT); + self.maxWidth = maxSize.width; CGSize size = [attributedText boundingRectWithSize:maxSize options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin @@ -50,7 +50,7 @@ } } - self.textWidth = layout.textBoundingRect.size.width; + self.textWidth = layout.textBoundingRect.size.width + 12; [super setAttributedText:attributedTextCopy]; } @@ -65,8 +65,8 @@ size = CGSizeMake(imageView.bounds.size.height * scale, imageView.bounds.size.height); imageView.bounds = CGRectMake(0, 0, size.width, size.height); }else{ - size = CGSizeMake(16, 16); - imageView.bounds = CGRectMake(0, 0, 16, 16); + size = CGSizeMake(18, 18); + imageView.bounds = CGRectMake(0, 0, 18, 18); } NSMutableAttributedString * replaceAttr = [NSMutableAttributedString yy_attachmentStringWithContent:imageView contentMode:UIViewContentModeScaleAspectFit diff --git a/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPRoomMessageTableViewCell.m b/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPRoomMessageTableViewCell.m index 27464366..ea32b006 100644 --- a/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPRoomMessageTableViewCell.m +++ b/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPRoomMessageTableViewCell.m @@ -27,6 +27,8 @@ @property (nonatomic,strong) XPNetImageYYLabel *contentLabel; ///点击空白区域的手势 @property (nonatomic,strong) UITapGestureRecognizer *tapEmptyRecognizer; + +@property(nonatomic, strong) UIVisualEffectView *blurEffectView; @end @implementation XPRoomMessageTableViewCell @@ -45,8 +47,9 @@ self.contentView.clipsToBounds = NO; self.selectionStyle = UITableViewCellSelectionStyleNone; - self.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:0.4];//[UIColor clearColor]; + self.backgroundColor = [UIColor clearColor]; [self.contentView addSubview:self.bubbleImageView]; + [self.contentView addSubview:self.blurEffectView]; [self.contentView addSubview:self.contentLabel]; UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTap)]; tap.delegate = self; @@ -59,9 +62,9 @@ - (void)initSubViewConstraints { [self.bubbleImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.leading.mas_equalTo(self.contentLabel).offset(-20); - make.top.mas_equalTo(self.contentLabel).offset(-10); - make.bottom.mas_equalTo(self.contentLabel);//.offset(10); + make.leading.mas_equalTo(self.contentLabel).offset(-16); + make.top.mas_equalTo(self.contentLabel).offset(0); + make.bottom.mas_equalTo(self.contentLabel).offset(10); make.trailing.mas_equalTo(self.contentLabel).offset(20); }]; @@ -70,6 +73,10 @@ make.bottom.mas_equalTo(-20); make.top.mas_equalTo(10); }]; + + [self.blurEffectView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.bubbleImageView); + }]; } - (void)setIsLeftBigImage:(BOOL)isLeftBigImage { @@ -144,34 +151,59 @@ self.contentLabel.attributedText = messageInfo.content; // self.contentLabel.textLayout = messageInfo.textLayout; - if (messageInfo.bubbleImageUrl.length) { + if (![NSString isEmpty:messageInfo.bubbleImageUrl]) { + self.blurEffectView.hidden = YES; @kWeakify(self); [self.bubbleImageView loadImageWithUrl:messageInfo.bubbleImageUrl completion:^(UIImage * _Nonnull image, NSURL * _Nonnull url) { @kStrongify(self); UIImage *image1 = [UIImage imageWithCGImage:image.CGImage scale:2.0 orientation:UIImageOrientationUp]; UIImage *cutImage = [image1 cropRightAndBottomPixels:2]; self.bubbleImageView.image = [self resizableImage:cutImage]; + + [self.contentLabel mas_remakeConstraints:^(MASConstraintMaker *make) { + make.leading.mas_equalTo(messageInfo.contentLeftMargin); + make.top.mas_equalTo(messageInfo.contentTopMargin); + make.bottom.mas_equalTo(- messageInfo.contentBottomMargin - messageInfo.cellBottomMargin); + +// make.centerY.mas_equalTo(self.contentView); + +// if (isMSRTL()) { + make.width.mas_greaterThanOrEqualTo([self RTLLabelWidth] - messageInfo.contentLeftMargin); +// make.height.mas_greaterThanOrEqualTo([self RTLLabelHeight]); +// } + }]; + + [self.bubbleImageView mas_updateConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(0); + make.leading.trailing.mas_equalTo(self.contentView).offset(0); +// make.trailing.mas_equalTo(self.contentLabel).offset(-messageInfo.contentRightMargin - 10); + }]; }]; - [self.contentLabel mas_remakeConstraints:^(MASConstraintMaker *make) { - make.leading.mas_equalTo(self.bubbleImageView).offset(self.messageInfo.contentLeftMargin + 12); -// make.top.mas_equalTo(self.bubbleImageView).offset(self.messageInfo.contentTopMargin+20); -// make.bottom.mas_equalTo(self.bubbleImageView).offset(-self.messageInfo.contentBottomMargin-10); - make.top.mas_equalTo(-10); - make.bottom.mas_equalTo(0); - if (isMSRTL()) { // MARK: 可能会有性能问题,但源代码已经使用了更新 layout 的方案,推测是头像框和气泡会导致卡顿 - make.width.mas_greaterThanOrEqualTo([self RTLLabelWidth]); - } - }]; + } else { + self.blurEffectView.hidden = NO; self.bubbleImageView.image = [UIImage imageWithColor:[DJDKMIMOMColor messageBubbleColor]]; [self.contentLabel mas_remakeConstraints:^(MASConstraintMaker *make) { - make.edges.mas_equalTo(self.contentView).inset(10); -// make.leading.mas_equalTo(self.bubbleImageView).offset(self.messageInfo.contentLeftMargin + 12); -// make.top.mas_equalTo(self.bubbleImageView).offset(self.messageInfo.contentTopMargin+10); -// make.bottom.mas_equalTo(self.bubbleImageView).offset(-self.messageInfo.contentBottomMargin-20); -// if (isMSRTL()) { // MARK: 可能会有性能问题,但源代码已经使用了更新 layout 的方案,推测是头像框和气泡会导致卡顿 -// make.width.mas_greaterThanOrEqualTo([self RTLLabelWidth]); -// } + make.leading.mas_equalTo(messageInfo.contentLeftMargin); + make.bottom.mas_equalTo(-messageInfo.cellBottomMargin); + make.top.mas_equalTo(messageInfo.contentTopMargin); + make.width.mas_equalTo([self RTLLabelWidth] - messageInfo.contentLeftMargin); + }]; +// [self.contentLabel mas_remakeConstraints:^(MASConstraintMaker *make) { +//// make.top.equalTo(self.contentView).offset(10); // 距离顶部 10 点 +//// make.bottom.equalTo(self.contentView).offset(-10); // 距离底部 10 点 +//// make.trailing.equalTo(self.contentView).offset(-10); // 距离右侧 10 点 +//// make.centerY.mas_equalTo(self.contentView); +//// if (isMSRTL()) { +//// make.width.mas_greaterThanOrEqualTo([self RTLLabelWidth]); +// make.height.mas_greaterThanOrEqualTo([self RTLLabelHeight]); +//// } +// make.leading.equalTo(self.contentView).offset(10); // 左侧有足够空间,避免过宽 +// }]; + [self.bubbleImageView mas_updateConstraints:^(MASConstraintMaker *make) { + make.leading.mas_equalTo(self.contentLabel).offset(-8); + make.trailing.mas_equalTo(self.contentLabel).offset(8); + make.bottom.mas_equalTo(self.contentLabel).offset(0); }]; } @@ -200,8 +232,16 @@ CGSize size = [self.contentLabel.attributedText boundingRectWithSize:CGSizeMake(kRoomMessageMaxWidth, 0) options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin context:nil].size; - NSLog(@" ----- 11 ----- %@", [NSValue valueWithCGSize:size]); - return MIN(ceil(size.width) + self.messageInfo.contentLeftMargin + self.messageInfo.contentRightMargin + 8, self.contentLabel.maxWidth); +// NSLog(@" ----- 11 ----- %@", [NSValue valueWithCGSize:size]); +// return MIN(ceil(size.width) + self.messageInfo.contentLeftMargin + self.messageInfo.contentRightMargin + 8, self.contentLabel.maxWidth); + return ceil(size.width);// + self.messageInfo.contentLeftMargin + self.messageInfo.contentRightMargin + 8; +} + +- (CGFloat)RTLLabelHeight { + CGSize size = [self.contentLabel.attributedText boundingRectWithSize:CGSizeMake(kRoomMessageMaxWidth, 0) + options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin + context:nil].size; + return ceil(size.height); } - (UIImage *)scaleToSize:(UIImage *)img { @@ -232,14 +272,19 @@ } } - - (NetImageView *)bubbleImageView { if (!_bubbleImageView) { _bubbleImageView = [[NetImageView alloc] init]; _bubbleImageView.clipsToBounds = NO; _bubbleImageView.userInteractionEnabled = YES; - _bubbleImageView.layer.masksToBounds = YES; - _bubbleImageView.layer.cornerRadius = 7; + [_bubbleImageView setCornerRadius:8]; +// _bubbleImageView.layer.masksToBounds = YES; +// _bubbleImageView.layer.cornerRadius = 8; + +// [_contentLabel setCornerRadius:8 +// corners:kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner | kCALayerMaxXMaxYCorner | kCALayerMinXMaxYCorner +// borderWidth:1 +// borderColor:[UIColor greenColor]]; } return _bubbleImageView; } @@ -256,9 +301,15 @@ - (XPNetImageYYLabel *)contentLabel { if (!_contentLabel) { _contentLabel = [[XPNetImageYYLabel alloc] init]; - _contentLabel.preferredMaxLayoutWidth = kRoomMessageMaxWidth - 24; + _contentLabel.preferredMaxLayoutWidth = kRoomMessageMaxWidth ; _contentLabel.numberOfLines = 0; _contentLabel.userInteractionEnabled = YES; + +// [_contentLabel setCornerRadius:8 +// corners:kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner | kCALayerMaxXMaxYCorner | kCALayerMinXMaxYCorner +// borderWidth:1 +// borderColor:[UIColor redColor]]; + } return _contentLabel; } @@ -270,4 +321,22 @@ } return _clickBtn; } + +- (UIVisualEffectView *)blurEffectView { + if (!_blurEffectView) { + // 创建模糊效果 + UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]; // 选择模糊样式(例如:Light, Dark, ExtraLight 等) + + // 创建包含模糊效果的视图 + _blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; + + // 设置模糊视图的大小与目标视图一致 + _blurEffectView.frame = CGRectMake(0, 0, KScreenWidth, 200); + _blurEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; // 使模糊视图适应目标视图的尺寸变化 + _blurEffectView.hidden = YES; + + [_blurEffectView setCornerRadius:8]; + } + return _blurEffectView; +} @end diff --git a/YuMi/Modules/YMRoom/View/MessageContainerView/XPRoomMessageContainerView.m b/YuMi/Modules/YMRoom/View/MessageContainerView/XPRoomMessageContainerView.m index 6393a44a..a538610e 100644 --- a/YuMi/Modules/YMRoom/View/MessageContainerView/XPRoomMessageContainerView.m +++ b/YuMi/Modules/YMRoom/View/MessageContainerView/XPRoomMessageContainerView.m @@ -1118,35 +1118,35 @@ NSString * const kRoomShowTopicKey = @"kRoomShowTopicKey"; #pragma mark - UITableViewDelegate And UITableViewDataSource -//- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { -// NSArray *source = @[]; -// switch (self.displayType) { -// case 1: -// source = self.datasource; -// break; -// case 2: -// source = self.datasource_chat; -// break; -// case 3: -// source = self.datasource_gift; -// break; -// -// default: -// source = self.datasource; -// break; -// } -// -// XPMessageInfoModel *model = [source xpSafeObjectAtIndex:indexPath.row]; -// -// // 如果 model 中有高度数据,使用 model 的高度 -// if (model.rowHeight > 0) { -// return model.rowHeight; -// } -// -// // 否则,使用自适应高度 +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + NSArray *source = @[]; + switch (self.displayType) { + case 1: + source = self.datasource; + break; + case 2: + source = self.datasource_chat; + break; + case 3: + source = self.datasource_gift; + break; + + default: + source = self.datasource; + break; + } + + XPMessageInfoModel *model = [source xpSafeObjectAtIndex:indexPath.row]; + + // 如果 model 中有高度数据,使用 model 的高度 + if (model.rowHeight > 0) { + return model.rowHeight; + } + + // 否则,使用自适应高度 // return 100; -//// return UITableViewAutomaticDimension; -//} + return UITableViewAutomaticDimension; +} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { switch (self.displayType) { @@ -1336,7 +1336,7 @@ NSString * const kRoomShowTopicKey = @"kRoomShowTopicKey"; _messageTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; _messageTableView.delegate = self; _messageTableView.dataSource = self; -// _messageTableView.rowHeight = UITableViewAutomaticDimension; + _messageTableView.rowHeight = UITableViewAutomaticDimension; // _messageTableView.estimatedRowHeight = 44; // 预估高度 _messageTableView.tableFooterView = [UIView new]; _messageTableView.separatorStyle = UITableViewCellSeparatorStyleNone;