调整 MedalsDetailView.m 中的高度约束以适应内容,优化 MedalsLevelIndicatorView.m 中的图片视图创建和加载逻辑,新增缓存图片 URL 属性以支持延迟加载,确保代码结构一致性。
This commit is contained in:
@@ -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);
|
||||
}];
|
||||
|
||||
// 设置等级选择回调
|
||||
|
@@ -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];
|
||||
|
Reference in New Issue
Block a user