如何解决如何在Objective-C中用新图像删除uibutton的旧图像
|| 我在编码时遇到了一个问题。我使用带有循环的自定义按钮在视图中显示了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)。
解决方法
正如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)保存在循环中创建的按钮指针,更新图像时,再次使用按钮指针调用setImage:forState:,这会将按钮中的旧图像替换为新图像。并且可以保存按钮的初始化/销毁时间。
2)保存步骤1)中的按钮指针,调用[button removeFromSuperView]从超级视图中删除按钮,然后重新创建一个新按钮并再次插入到超级视图中。不建议使用这种方法,因为在创建新按钮之后,旧按钮将被销毁,新按钮将被初始化,这两个操作都将花费性能(时间),并且如果在按钮顶部添加了一些其他子视图, ,您需要将所有视图置于按钮顶部,然后再次置于顶部。因此,如果没有任何特定原因需要重新创建一个新按钮,只需按照步骤1)进行操作即可,它既简单又快速。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。