如何使案例覆盖以前的案例

时间:2014-03-26 07:59:44

标签: ios objective-c switch-statement

我有很多案例会为每个案例生成不同的图像。问题是,图像一旦生成就会堆叠起来。如何设置每个案例以覆盖上一个图像?

- (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
    }
}

3 个答案:

答案 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语句中设置它的图像,即使它被放置多个,它也会保留最后一个引用。