修正表情播放问题

This commit is contained in:
AI Health Developer
2025-04-28 18:28:59 +08:00
parent 41aae87dd6
commit a9538c61ff
2 changed files with 122 additions and 2 deletions

View File

@@ -7,6 +7,7 @@
"nonatomic"
],
"cSpell.words": [
"autoreleasepool",
"Subview"
]
}

View File

@@ -179,7 +179,8 @@
[self.faceImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.mas_equalTo(self.avatarImageView);
make.width.height.mas_equalTo(80);
make.width.mas_equalTo(kGetScaleWidth(80));
make.height.mas_equalTo(80);
}];
[self.groupTypeButton mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -210,6 +211,123 @@
}
- (UIImage *)combineImageInOne:(RoomFaceSendInfoModel *)faceInfo {
#if DEBUG
NSAssert([NSThread isMainThread], @"UIKit操作必须在主线程执行!");
#endif
// CGSize size = CGSizeMake(80, 80);
CGSize size = CGSizeMake(CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds));
UIImage *result;
NSInteger faceCount = faceInfo.resultIndexes.count > 9 ? 9 : faceInfo.resultIndexes.count;
CGFloat x = 0;
CGFloat y = 0;
CGFloat width = CGRectGetWidth(self.bounds);
CGFloat height = CGRectGetHeight(self.bounds);
CGFloat spaceX3 = 0; //X
CGFloat spaceX2 = (size.width - width * 2) / 2; //X
CGFloat spaceX1 = (size.width - width) / 2; //X
CGFloat spaceY3 = 0; //Y
CGFloat spaceY2 = (size.height - height * 2) / 2; //Y
CGFloat spaceY1 = (size.height - height) / 2; //Y
y = faceCount > 6 ? spaceY3 : (faceCount >= 3 ? spaceY2 : spaceY1);
x = faceCount % 3 == 0 && faceCount > 3 ? spaceX3 : (faceCount % 3 == 2 ? spaceX2 : spaceX1);
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
//
RoomFaceInfoModel *faceModel = [[XPRoomFaceTool shareFaceTool] findFaceInfoById:faceInfo.faceId];
#if DEBUG
// faceModel.displayType = FaceDisplayType_OverLay;
#endif
if (faceModel.displayType == FaceDisplayType_OnlyOne && faceCount > 0) {
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
//
NSInteger index = [faceInfo.resultIndexes[0] integerValue];
UIImage *singleImage = [[XPRoomFaceTool shareFaceTool] findFaceImageById:faceInfo.faceId index:index];
if (!singleImage) singleImage = [UIImage imageNamed:@"default_face_placeholder"];
CGRect drawRect = [self aspectFitRectForImage:singleImage.size
inRect:CGRectMake(0, 0, size.width, size.height)];
[singleImage drawInRect:drawRect];
} else if (faceModel.displayType == FaceDisplayType_OverLay) {
size = CGSizeMake(size.width * 4, size.height*3);
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
//
CGFloat currentX = 0;
for (int i = 0; i < faceCount; i++) {
if (i >= faceInfo.resultIndexes.count) break;
@autoreleasepool {
NSInteger index = [faceInfo.resultIndexes[i] integerValue];
UIImage *singleImage = [[XPRoomFaceTool shareFaceTool] findFaceImageById:faceInfo.faceId index:index];
if (!singleImage) continue;
CGRect drawRect = [self aspectFitRectForImage:singleImage.size
inRect:CGRectMake(currentX,
size.height/2 - singleImage.size.height/2,
singleImage.size.width,
singleImage.size.height)];
[singleImage drawInRect:drawRect];
currentX = CGRectGetMidX(drawRect); //
}
}
} else if (faceModel.displayType == FaceDisplayType_Flow) {
size = CGSizeMake(size.width * 3, size.height * 2);
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
//
NSInteger maxPerRow = 3;
NSInteger totalRows = ceil((float)faceCount / (float)maxPerRow);
NSMutableArray *rowsDistribution = [NSMutableArray array];
NSInteger remaining = faceCount;
//
for (NSInteger row = totalRows-1; row >= 0; row--) {
NSInteger itemsInRow = (row == 0 && faceCount % maxPerRow != 0) ? faceCount % maxPerRow : maxPerRow;
itemsInRow = MIN(remaining, itemsInRow);
[rowsDistribution insertObject:@(itemsInRow) atIndex:0];
remaining -= itemsInRow;
}
//
CGFloat startY = size.height - totalRows * height;
__block NSInteger currentIndex = 0;
//
[rowsDistribution enumerateObjectsUsingBlock:^(NSNumber *rowCount, NSUInteger rowIdx, BOOL * _Nonnull stop) {
NSInteger itemsInRow = [rowCount integerValue];
CGFloat rowWidth = itemsInRow * width + (itemsInRow - 1) * spaceX3;
CGFloat startX = (size.width - rowWidth) / 2;
for (NSInteger col = 0; col < itemsInRow; col++) {
if (currentIndex >= faceCount) return;
NSInteger index = [faceInfo.resultIndexes[currentIndex] integerValue];
UIImage *image = [[XPRoomFaceTool shareFaceTool] findFaceImageById:faceInfo.faceId index:index] ?: [UIImage imageNamed:@"default_face_placeholder"];
CGRect rect = CGRectMake(startX + col*(width+spaceX3),
startY + rowIdx*height,
width,
height);
[image drawInRect:[self aspectFitRectForImage:image.size inRect:rect]];
currentIndex++;
}
}];
}
result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return result;
}
//
- (CGRect)aspectFitRectForImage:(CGSize)imageSize inRect:(CGRect)container {
CGFloat scale = MIN(container.size.width/imageSize.width, container.size.height/imageSize.height);
return CGRectMake(container.origin.x + (container.size.width - imageSize.width*scale)/2,
container.origin.y + (container.size.height - imageSize.height*scale)/2,
imageSize.width*scale,
imageSize.height*scale);
}
- (UIImage *)_combineImageInOne:(RoomFaceSendInfoModel *)faceInfo {
CGSize size = CGSizeMake(80, 80);
UIImage *result;
NSInteger faceCount = faceInfo.resultIndexes.count > 9 ? 9 : faceInfo.resultIndexes.count;
@@ -235,7 +353,7 @@
return singleImage;
break;
}
if (faceModel.displayType == FaceDisplayType_Flow) {
[singleImage drawInRect:CGRectMake(x, y, width, height)];
if (i % 3 == 0) { //
@@ -757,6 +875,7 @@
_faceImageView = [[UIImageView alloc] init];
_faceImageView.backgroundColor = [UIColor clearColor];
_faceImageView.userInteractionEnabled = YES;
_faceImageView.contentMode = UIViewContentModeScaleAspectFit;
}
return _faceImageView;
}