Files
featherVoice/TUIKit/TUIMultimediaPlugin/Edit/UI/CommonEditor/Views/Sticker/TUIMultimediaSubtitleView.m

124 lines
4.0 KiB
Mathematica
Raw Normal View History

2025-08-08 10:49:36 +08:00
// Copyright (c) 2024 Tencent. All rights reserved.
// Author: eddardliu
#import "TUIMultimediaSubtitleView.h"
#import "TUIMultimediaPlugin/TUIMultimediaCommon.h"
#import "TUIMultimediaPlugin/TUIMultimediaGeometry.h"
#define MIN_SUBTITLE_PASTER_WIDTH 100
#define MAX_SUBTITLE_PASTER_HEIGH 400
@interface TUIMultimediaSubtitleView () <TUIMultimediaStickerViewDelegate> {
id<TUIMultimediaStickerViewDelegate> _outerDelegate;
UILabel *_label;
BOOL _isSizeToFitingSubtitleInfo;
}
@end
@implementation TUIMultimediaSubtitleView
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self != nil) {
[self initUI];
}
_isSizeToFitingSubtitleInfo = NO;
return self;
}
- (void)initUI {
[super setDelegate:self];
_label = [[UILabel alloc] init];
_label.font = [UIFont systemFontOfSize:20];
_label.numberOfLines = 0;
_label.lineBreakMode = NSLineBreakByClipping;
_label.translatesAutoresizingMaskIntoConstraints = NO;
}
#pragma mark - Getters & Setters
- (void)setSubtitleInfo:(TUIMultimediaSubtitleInfo *)subtitleInfo {
NSLog(@"TUIMultimediaSubtitleView setSubtitleInfo text = %@",subtitleInfo.wrappedText);
_subtitleInfo = subtitleInfo;
self.content = nil;
_label.text = subtitleInfo.wrappedText;
_label.textColor = subtitleInfo.color;
[self labeSizeToFit];
self.content = _label;
}
-(void)labeSizeToFit {
_isSizeToFitingSubtitleInfo = YES;
if (_subtitleInfo.wrappedText.length > 0) {
_label.text = [NSString stringWithFormat:@"%C", [_subtitleInfo.wrappedText characterAtIndex:0]];
} else {
NSLog(@"_subtitleInfo.wrappedText is empty or nil.");
_label.text = @"";
}
CGSize size = [_label sizeThatFits:CGSizeMake(MAXFLOAT, MAX_SUBTITLE_PASTER_HEIGH)];
CGFloat singleLineTextHeight = size.height;
_label.text = _subtitleInfo.wrappedText;
size = [_label sizeThatFits:CGSizeMake(MAXFLOAT, MAX_SUBTITLE_PASTER_HEIGH)];
CGFloat adjustedWidth = size.width;
if (size.height > singleLineTextHeight * 1.5) {
// multi line text
adjustedWidth = MAX(size.width, MIN_SUBTITLE_PASTER_WIDTH);
}
CGFloat adjustedHeight = MIN(size.height, MAX_SUBTITLE_PASTER_HEIGH);
_label.frame = CGRectMake(_label.frame.origin.x, _label.frame.origin.y, adjustedWidth, adjustedHeight);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self->_isSizeToFitingSubtitleInfo = NO;
});
}
- (id<TUIMultimediaStickerViewDelegate>)delegate {
return _outerDelegate;
}
- (void)setDelegate:(id<TUIMultimediaStickerViewDelegate>)delegate {
_outerDelegate = delegate;
}
#pragma mark - TUIMultimediaFloatingResizableDelegate protocol
- (void)onStickerViewShouldDelete:(TUIMultimediaStickerView *)v {
[_outerDelegate onStickerViewShouldDelete:self];
}
- (void)onStickerViewShouldEdit:(TUIMultimediaStickerView *)v {
[_outerDelegate onStickerViewShouldEdit:self];
}
- (void)onStickerViewSelected:(TUIMultimediaStickerView *)v {
[_outerDelegate onStickerViewSelected:self];
}
- (void)onStickerViewSizeChanged:(TUIMultimediaStickerView *)v {
[_outerDelegate onStickerViewSizeChanged:self];
if (_isSizeToFitingSubtitleInfo == NO) {
[self adjustFontSize];
}
}
- (void)adjustFontSize {
NSString *text = _label.text;
CGSize labelSize = _label.bounds.size;
UIFont *font = _label.font;
CGFloat minFontSize = 0;
CGFloat maxFontSize = 1000;
const CGFloat eps = 0.1;
// 14
while (maxFontSize - minFontSize > eps) {
CGFloat mid = (maxFontSize + minFontSize) / 2;
font = [font fontWithSize:mid];
CGSize size = [text sizeWithAttributes:@{NSFontAttributeName : font}];
if (size.width < labelSize.width && size.height < labelSize.height) {
minFontSize = mid;
} else {
maxFontSize = mid;
}
}
_label.font = [_label.font fontWithSize:minFontSize];
}
@end