我有很多案例会为每个案例生成不同的图像。问题是,图像一旦生成就会堆叠起来。如何设置每个案例以覆盖上一个图像?
- (void)setTileValue:(NSInteger)tileValue {
_tileValue = tileValue;
self.numberLabel.text = [@(tileValue) stringValue];
UIImageView *backgroundView = [self backgroundView:[@(tileValue) intValue]];
[self.numberLabel addSubview:backgroundView];
self.value = tileValue;
}
- (UIImageView *)backgroundView:(NSUInteger)value {
switch (value) {
case 1:
return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background"]]; // light gray
case 2:
return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background1"]]; // gray
case 4:
return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background2"]]; // gark gray
case 8:
return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background3"]]; // red
case 16:
return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background4"]]; // orange
default:
return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background"]];
}
}
更新代码:因此程序每次都使用initWithImage创建一个新图像。我将返回设置为仅返回UIImage。为什么这段代码没有解决问题呢?
- (void)setTileValue:(NSInteger)tileValue {
_tileValue = tileValue;
self.numberLabel.text = [@(tileValue) stringValue];
// UIImageView *backgroundView = [self backgroundView:[@(tileValue) intValue]];
UIImageView *backgroundView = [[UIImageView alloc] initWithImage:[self tileBG:[@(tileValue) intValue]]]; [self.numberLabel addSubview:backgroundView];
self.numberLabel.backgroundColor = [self tileColorForValue:[@(tileValue) intValue]];
self.backgroundColor = [self tileColorForValue:[@(tileValue) intValue]];
self.numberLabel.textColor = [self numberColorForValue:[@(tileValue) intValue]];
self.value = tileValue;
}
- (UIColor *)defaultBackgroundColor {
return [UIColor lightGrayColor];
}
- (UIColor *)defaultNumberColor {
return [UIColor colorWithWhite:0.0 alpha:0.0];
}
- (UIImage *)tileBG:(NSUInteger)value {
switch (value) {
case 1:
return [UIImage imageNamed:@"background"]; // light gray
case 2:
return [UIImage imageNamed:@"background1"]; // gray
case 4:
return [UIImage imageNamed:@"background2"]; // gark gray
case 8:
return [UIImage imageNamed:@"background3"]; // red
case 16:
return [UIImage imageNamed:@"background4"]; // red
case 32:
return [UIImage imageNamed:@"background5"]; // red
default:
return [UIImage imageNamed:@"background"]; // red
}
}
答案 0 :(得分:2)
您每次都要制作新的图片视图并添加它。最终这可能会导致您的应用程序因内存使用而崩溃(大量的图像视图可能会费用不计)。
使图像视图一次,并相应地设置其图像(只需从switch语句返回图像),或者在添加新图像之前删除上一个图像视图。
你需要在某个地方保留对图像视图的引用,理想情况是这是任何类的属性。然后,只需设置其图像属性。不要在此处创建新的图片视图,也不要添加任何子视图。应在init方法中创建一次图像视图。
答案 1 :(得分:1)
请阅读上面的评论。然后修改您的setTitleCode
看起来像这样。
- (void)setTileValue:(NSInteger)tileValue
{
_tileValue = tileValue;
self.numberLabel.text = [@(tileValue) stringValue];
UIImageView *backgroundView = (UIImageView *)[self.numberLabel viewWithTag:1000]; // edited code to avoid warning
if (!backgroundView)
{
backgroundView = [[UIImageView alloc] initWithImage:[self tileBG:[@(tileValue) intValue]]];
backgroundView.tag = 1000;
[self.numberLabel addSubview:backgroundView];
}
backgroundView.image = [self tileBG:[@(tileValue) intValue]];
self.numberLabel.backgroundColor = [self tileColorForValue:[@(tileValue) intValue]];
self.backgroundColor = [self tileColorForValue:[@(tileValue) intValue]];
self.numberLabel.textColor = [self numberColorForValue:[@(tileValue) intValue]];
self.value = tileValue;
}
答案 2 :(得分:0)
如果您的意思是在切换后创建了多张图片,请尝试使用
break();
但安全的事情是创建一个imageView并初始化它,然后在switch语句中设置它的图像,即使它被放置多个,它也会保留最后一个引用。