我在编码时遇到了一个问题,就是这样。我使用带有循环的自定义按钮在视图中显示了20个图像。一段时间后,我正在用新图像更改按钮图像。但是这里发生的事情是旧图像显示在当前图像的背面。
for(currentRow = 0; currentRow < 5; currentRow++)
{
for (currentColumn = 0 ; currentColumn < 4; currentColumn++)
{
if(indexValue<20)
{
printf("\n index value %d",indexValue);
A *aObject = [aList objectAtIndex:indexValue];
MyCustomButton *myButton = [[MyCustomButton alloc] initWithIdValue:aObject.aName];
CGRect imageFrame = CGRectMake(currentColumn * 80+5, currentRow * 80+5, 67, 67);
[myButton setImage:[UIImage imageNamed:aObject.aName] forState:UIControlStateNormal];
[myButton setFrame:imageFrame];
myButton.backgroundColor=[UIColor clearColor];
[myButton addTarget:self action:@selector(aAction:) forControlEvents:UIControlEventTouchUpInside];
[myView addSubview:myButton];
[myButton release];
myButton = nil;
}
}
}
帮助我解决这个问题,
谢谢你, Madan Mohan。
答案 0 :(得分:1)
正如onnoweb已经提到的: 每次要更改图像时都不应添加新按钮。 我选择的方法是,在视图的viewDidLoad中创建所需的所有按钮并将其添加到那里。 例如:(伪代码)
- (void)viewDidLoad
{
for(int i = 0; i < columnCount; i++)
{
for(int j = 0; j < rowCount; j++)
{
MyCustomButton *myButton = [[MyCustomButton alloc] initWithIdValue:aObject.aName];
CGRect imageFrame = CGRectMake(currentColumn * 80+5, currentRow * 80+5, 67, 67);
forState:UIControlStateNormal];
[myButton setFrame:imageFrame];
myButton.backgroundColor=[UIColor clearColor];
[myButton addTarget:self action:@selector(aAction:) forControlEvents:UIControlEventTouchUpInside];
[myView addSubview:myButton];
[myButton release];
myButton = nil;
}
}
}
然后您可以使用以下行更改循环中的图像:(伪代码)
myButton = buttonMatrix[row][column];
[myButton setImage:[UIImage imageNamed:aObject.aName] forState:UIControlStateNormal];
与不总是创建新按钮而不释放旧按钮相比,这还要少得多。
答案 1 :(得分:0)
您有两种方法可以解决此问题:
1)保存你在循环中创建的按钮指针,在更新图像时,使用按钮指针调用setImage:forState:再次,这将用新图像替换按钮中的旧图像。并保存按钮的初始化/销毁时间。
2)将按钮指针保存为步骤1),调用[button removeFromSuperView]按钮从超级视图中删除该按钮,然后重新创建一个新按钮并再次插入超级视图。这是不推荐的方式,因为旧按钮将被销毁并且新按钮将被初始化,这些操作都会降低性能(时间),如果在按钮顶部添加了一些其他子视图,则在创建新按钮之后,你需要让按钮顶部的所有视图再次位于顶部。因此,如果您没有任何具体原因需要重新创建新按钮,请按照步骤1)进行操作,这很简单快捷。