重用子视图

时间:2009-08-03 21:45:55

标签: iphone objective-c cocoa uikit

我有一个UIImageView对象,它只是一个普通的黑色矩形。 这就是我用来在视图中选择按钮的方法。

问题是,我在视图中有49个这样的按钮,并且可以同时选择所有这些按钮。

我用于向子按钮添加子视图的内容是:

UIImageView* selectedSquareView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,40,40)];
[selectedSquareView setImage:[UIImage imageNamed:@"SelectedSquare.png"]];
[button addSubview: selectedSquareView];

我希望selectedSquareView可以多次重复使用,作为其他按钮的子视图,但只保留一个分配。我不希望仅为此目的同时创建49个UIImageViews。这可能吗?

如果没有,我应该将它们存储在NSMutableArray中以便以后轻松删除吗?

此致

-Raymond

2 个答案:

答案 0 :(得分:1)

你需要49个UIImageViews,你只需要1个UIImage。 UIImageViews包含每个按钮的位置,大小,is_higlighted等信息。

即使你有很多UIImage,UIImage应该对这些东西非常聪明,正如Apple在他们的文档中描述的那样:

  

在内存不足的情况下,可以从UIImage对象中清除图像数据以释放系统上的内存。此清除行为仅影响UIImage对象内部存储的图像数据,而不影响对象本身。当您尝试绘制其数据已被清除的图像时,图像对象会自动从其原始文件重新加载数据。然而,这个额外的负载步骤可能会导致很小的性能损失。

     

您应该避免创建大小超过1024 x 1024的UIImage对象。除了这样的图像会占用大量内存之外,在OpenGL ES中将图像用作纹理或将图像绘制到视图或图层时,可能会遇到问题。如果您正在执行基于代码的操作,则此大小限制不适用,例如通过将大小超过1024 x 1024像素的图像绘制到位图支持的图形上下文来调整大小。实际上,您可能需要以这种方式调整图像大小(或将其分成几个较小的图像),以便将其绘制到您的一个视图中。

或者,如果你真的觉得你需要在不使用时删除UIImageView,你可以按照建议将它们存储在数组中并在viewDidDisappear上释放它们,然后在viewWillAppear上重新创建它们。

答案 1 :(得分:0)

每个UIView只出现一次,所以你肯定需要创建49份副本。

您当前的代码可能很好,因为UIImage可能会缓存图像,但您可能只想创建一次图像然后每次都设置它,例如:

UIImageView* selectedSquareView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,40,40)];
static UIImage* kSelectedSquareImage = [UIImage imageNamed:@"SelectedSquare.png"] retain];
[selectedSquareView setImage:kSelectedSquareImage];
  

如果没有,我应该把它们存放在一个   NSMutableArray以便以后轻松删除?

这取决于容器视图中是否还有其他视图 - 如果没有,则不需要将它们存储在NSMutableArray中,因为您只需使用container.subviews来获取视图数组。否则,当然,您可以将它们存储在NSMutableArray中并以这种方式删除它们(只需确保将它们从数组中删除或释放数组,因此它们将保留在内存中,因为它们存储在数组中)。 / p>