From 06fecf1bf48513f9ee17ba8a0f018fddda644317 Mon Sep 17 00:00:00 2001 From: edwinQQQ Date: Thu, 19 Jun 2025 11:49:25 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=20MedalsDetailView.m=20?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E9=AB=98=E5=BA=A6=E7=BA=A6=E6=9D=9F=E4=BB=A5?= =?UTF-8?q?=E9=80=82=E5=BA=94=E5=86=85=E5=AE=B9=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=20MedalsLevelIndicatorView.m=20=E4=B8=AD=E7=9A=84=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E8=A7=86=E5=9B=BE=E5=88=9B=E5=BB=BA=E5=92=8C=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E9=80=BB=E8=BE=91=EF=BC=8C=E6=96=B0=E5=A2=9E=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E5=9B=BE=E7=89=87=20URL=20=E5=B1=9E=E6=80=A7=E4=BB=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=BB=B6=E8=BF=9F=E5=8A=A0=E8=BD=BD=EF=BC=8C?= =?UTF-8?q?=E7=A1=AE=E4=BF=9D=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../YMMine/View/Medals/MedalsDetailView.m | 2 +- .../View/Medals/MedalsLevelIndicatorView.m | 127 +++++++++++++----- 2 files changed, 94 insertions(+), 35 deletions(-) diff --git a/YuMi/Modules/YMMine/View/Medals/MedalsDetailView.m b/YuMi/Modules/YMMine/View/Medals/MedalsDetailView.m index b1af74ff..63791802 100644 --- a/YuMi/Modules/YMMine/View/Medals/MedalsDetailView.m +++ b/YuMi/Modules/YMMine/View/Medals/MedalsDetailView.m @@ -87,7 +87,7 @@ make.centerX.mas_equalTo(self); make.top.mas_equalTo(self.subLabel).offset(24); make.leading.trailing.mas_greaterThanOrEqualTo(self).inset(8); - make.height.mas_equalTo(26); // 增加高度以适应圆点和文本 + make.height.mas_equalTo(66); }]; // 设置等级选择回调 diff --git a/YuMi/Modules/YMMine/View/Medals/MedalsLevelIndicatorView.m b/YuMi/Modules/YMMine/View/Medals/MedalsLevelIndicatorView.m index c1d8a9ad..e18dc8e4 100644 --- a/YuMi/Modules/YMMine/View/Medals/MedalsLevelIndicatorView.m +++ b/YuMi/Modules/YMMine/View/Medals/MedalsLevelIndicatorView.m @@ -19,12 +19,12 @@ @property (nonatomic, assign) BOOL hasImage; @property (nonatomic, strong) UIImage *originalImage; // 保存原始彩色图片 @property (nonatomic, strong) UIImage *grayImage; // 保存灰度图片 +@property (nonatomic, copy) NSString *cachedImageUrl; // 缓存图片URL,用于延迟加载 - (instancetype)initWithLevel:(NSInteger)level; - (void)setSelected:(BOOL)selected animated:(BOOL)animated; - (void)setImageUrl:(NSString *)imageUrl; - -//- (void) +- (void)createImageViewIfNeeded; @end @@ -67,30 +67,48 @@ return self; } -- (void)setImageUrl:(NSString *)imageUrl { - if (!_imageView) { - // 创建图片视图 - _imageView = [[NetImageView alloc] init]; - _imageView.contentMode = UIViewContentModeScaleAspectFill; - _imageView.clipsToBounds = YES; - [self addSubview:_imageView]; - - [_imageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerX.mas_equalTo(self); - make.bottom.mas_equalTo(_dotView.mas_top).offset(-4); - make.width.height.mas_equalTo(40); - }]; - - // 调整圆点位置 - [_dotView mas_remakeConstraints:^(MASConstraintMaker *make) { - make.centerX.mas_equalTo(self); - make.top.mas_equalTo(_imageView.mas_bottom).offset(4); - make.width.height.mas_equalTo(6); - }]; +- (void)createImageViewIfNeeded { + if (_imageView) { + return; } - _hasImage = YES; + // 创建图片视图 + _imageView = [[NetImageView alloc] init]; + _imageView.contentMode = UIViewContentModeScaleAspectFill; + _imageView.clipsToBounds = YES; + [self addSubview:_imageView]; + [_imageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self); + make.bottom.mas_equalTo(_dotView.mas_top).offset(-4); + make.width.height.mas_equalTo(40); + }]; + + // 调整圆点位置 + [_dotView mas_remakeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self); + make.top.mas_equalTo(_imageView.mas_bottom).offset(4); + make.width.height.mas_equalTo(6); + }]; + + // 如果有缓存的图片URL,加载图片 + if (_cachedImageUrl) { + [self loadImageWithUrl:_cachedImageUrl]; + _cachedImageUrl = nil; + } +} + +- (void)setImageUrl:(NSString *)imageUrl { + _hasImage = YES; + _cachedImageUrl = imageUrl; + + // 如果已经创建了imageView,直接加载图片 + if (_imageView) { + [self loadImageWithUrl:imageUrl]; + } +} + +- (void)loadImageWithUrl:(NSString *)imageUrl { // 调试时使用测试URL #ifdef DEBUG NSString *testUrl = @"https://img.toto.im/mw600/66b3de17ly1i2jopju47bj20xc1e0dx4.jpg.webp"; @@ -202,9 +220,21 @@ // 创建新的等级指示器 CGFloat itemWidth = 25.0; // 每个等级指示器的宽度 - CGFloat spacing = 35.0; // 等级指示器之间的间距 - CGFloat totalWidth = itemWidth * maxLevel + spacing * (maxLevel - 1); - CGFloat startX = (self.bounds.size.width - totalWidth) / 2; + + // 计算可用宽度(考虑左右各20点的边距) + CGFloat availableWidth = self.bounds.size.width - 40.0; // 左右各减去20点 + + // 计算间距 + CGFloat spacing = 0; + if (maxLevel > 1) { + spacing = (availableWidth - itemWidth * maxLevel) / (maxLevel - 1); + } + + // 如果间距太小,设置一个最小值 + spacing = MAX(spacing, 10.0); + + // 起始位置(左边距20点) + CGFloat startX = 20.0; for (NSInteger i = 1; i <= maxLevel; i++) { // 创建等级指示器 @@ -249,11 +279,21 @@ [super layoutSubviews]; if (_maxLevel > 0 && _levelItems.count > 0) { - // 重新计算布局,确保居中显示 + // 计算可用宽度(考虑左右各20点的边距) CGFloat itemWidth = 25.0; - CGFloat spacing = 15.0; - CGFloat totalWidth = itemWidth * _maxLevel + spacing * (_maxLevel - 1); - CGFloat startX = (self.bounds.size.width - totalWidth) / 2; + CGFloat availableWidth = self.bounds.size.width - 40.0; // 左右各减去20点 + + // 计算间距 + CGFloat spacing = 0; + if (_maxLevel > 1) { + spacing = (availableWidth - itemWidth * _maxLevel) / (_maxLevel - 1); + } + + // 如果间距太小,设置一个最小值 + spacing = MAX(spacing, 10.0); + + // 起始位置(左边距20点) + CGFloat startX = 20.0; for (NSInteger i = 0; i < _levelItems.count; i++) { LevelItemView *item = _levelItems[i]; @@ -262,6 +302,15 @@ make.leading.mas_equalTo(self).offset(x); }]; } + + // 更新连接线 + for (NSInteger i = 0; i < _connectionLines.count && i + 1 < _levelItems.count; i++) { + UIView *line = _connectionLines[i]; + [line mas_updateConstraints:^(MASConstraintMaker *make) { + make.leading.mas_equalTo(_levelItems[i].dotView.mas_centerX); + make.trailing.mas_equalTo(_levelItems[i+1].dotView.mas_centerX); + }]; + } } } @@ -302,6 +351,12 @@ // 如果已经创建了视图,需要根据类型进行调整 if (_levelItems.count > 0) { + // 如果是带图片类型,创建 imageView + if (indicatorType == MedalsLevelIndicatorTypeWithImage) { + for (LevelItemView *item in _levelItems) { + [item createImageViewIfNeeded]; + } + } [self updateImageVisibility]; } } @@ -321,11 +376,14 @@ } LevelItemView *item = _levelItems[level - 1]; - [item setImageUrl:imageUrl]; - // 根据当前类型设置图片可见性 - if (item.imageView) { - item.imageView.hidden = (_indicatorType == MedalsLevelIndicatorTypeNormal); + // 根据指示器类型决定是否创建和加载图片 + if (_indicatorType == MedalsLevelIndicatorTypeWithImage) { + [item createImageViewIfNeeded]; // 确保创建了 imageView + [item setImageUrl:imageUrl]; + } else { + // 在普通模式下,只保存URL,不创建 imageView + [item setImageUrl:imageUrl]; } } @@ -336,6 +394,7 @@ LevelItemView *item = _levelItems[i]; CGPoint itemLocation = [self convertPoint:location toView:item]; + // 检查点击是否在 item 的边界内 if (CGRectContainsPoint(item.bounds, itemLocation)) { NSInteger level = i + 1; [self setSelectedLevel:level animated:YES];