我有一个TapDetectingImageView类,它在使用后与内存有关,因为我没有在我的代码中重用它。 我现在更改我的代码以重复使用它,而不是每次都重新创建一个新代码。
目标是配置TapDetectingImageView对象并将其放在视图中。我会做8次但是使用下面的代码,只显示最后一个。我确定我错过了什么,但是什么? ;)
持有imageViews的视图是potatoeView。我正在通过以下方式添加新的TapDetectingImageView:
[potatoeView addSubview:imageView];
该代码有什么问题?
for (int i = 0; i <= numberOfPotatoes-1; i++)
{
NSLog(@"potatoesView Generation : %d",i);
NSArray *imgArray = [[NSArray alloc] initWithArray:[p objectAtIndex:i]];
UIImage *img1 = (UIImage *) [imgArray objectAtIndex:0];
UIImage *img2 = (UIImage *) [imgArray objectAtIndex:1];
NSString *imgName = (NSString *) [imgArray objectAtIndex:2];
if (imageView == nil) {
imageView = [[TapDetectingImageView alloc] initWithImage:img1 imageHighlighted:img2];
}else {
[imageView setImage:(UIImage *)img1];
[imageView setImageHighlighted:(UIImage *)img2];
}
[imageView setDelegate:self];
// setup each frame to a default height and width, it will be properly placed when we call "updateScrollList"
CGRect rect = imageView.frame;
rect.size.height = [potatoesSize floatValue] ;
rect.size.width = [potatoesSize floatValue] ;
imageView.frame = rect;
[imageView setName:(NSString *)imgName];
imageView.tag = i+1; // tag our images for later use when we place them in serial fashion
NSValue *val = [potatoesSizeAndPositions objectAtIndex:i];
CGPoint point = [val CGPointValue];
imageView.center = point;
[potatoeView addSubview:imageView];
[imgArray release];
}
答案 0 :(得分:3)
您似乎从根本上误解了您的观点。当您使用八个不同的位置和图像设置相同的视图实例时,它不会在某些画布上“标记”它们。在主运行循环开始绘制视图之前,不会查询其状态,此时它会询问您的视图的框架和内容等等以便绘制它。如果你想用UIViews绘制八个不同的图像,你需要八个不同的视图。
答案 1 :(得分:1)
您只创建一个视图,将其设置为子视图,然后将其更改n-1次。删除if (imageView==nil)
并创建所有8个。