调整 MedalsDetailView.m 中的高度约束以适应内容,优化 MedalsLevelIndicatorView.m 中的图片视图创建和加载逻辑,新增缓存图片 URL 属性以支持延迟加载,确保代码结构一致性。

This commit is contained in:
edwinQQQ
2025-06-19 11:49:25 +08:00
parent c978a8c355
commit 06fecf1bf4
2 changed files with 94 additions and 35 deletions

View File

@@ -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);
}];
//

View File

@@ -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,8 +67,11 @@
return self;
}
- (void)setImageUrl:(NSString *)imageUrl {
if (!_imageView) {
- (void)createImageViewIfNeeded {
if (_imageView) {
return;
}
//
_imageView = [[NetImageView alloc] init];
_imageView.contentMode = UIViewContentModeScaleAspectFill;
@@ -87,10 +90,25 @@
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];