使用 iCarousel ios 重用视图

Posted

技术标签:

【中文标题】使用 iCarousel ios 重用视图【英文标题】:Re-using views with iCarousel ios 【发布时间】:2012-10-20 18:17:40 【问题描述】:

我正在使用 ICarousel 构建一个应用程序。 轮播中将有大约 30 个项目。 每个项目都是一个带有 UIImageView 显示动画的视图。

现在我只是提前创建所有 30 个视图,将它们添加到数组中,并在需要时提供给轮播。

        SBTViewController* iv1 = [[SBTViewController alloc] initWithNibName:@"SBTViewController" bundle:nil];
    SBTViewController* iv2 = [[SBTViewController alloc] initWithNibName:@"SBTViewController" bundle:nil];
 .....
 .....
    SBTViewController* iv30 = [[SBTViewController alloc] initWithNibName:@"SBTViewController_iPhone" bundle:nil];


viewsarray = [NSArray arrayWithObjects: iv1,iv2...  iv30]

当轮播需要更多视图时 - 我只提供数组中的视图

但是,我开始收到 MemoryWarnings。 尝试使用“reuseView”选项,但它根本不起作用,或者我误解了一些东西。 每次调用以下内容:

  - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view



我只是尝试将“视图”更改为我的屏幕外视图之一。但这似乎不起作用。轮播显示空白屏幕。

怎么了?

谢谢

【问题讨论】:

【参考方案1】:

ReusingView 旨在通过回收视图来减少分配/释放视图的需要。但是因为您将所有视图存储在一个数组中,所以它对您没有帮助,因为它们都是一次创建的,并且无论如何都不会发布。

问题在于您试图一次将太多图像加载到内存中(视图数 x 每个视图的动画帧数)。

您需要找到一种动态加载框架的方法。试试我的 GLView 库 (https://github.com/nicklockwood/GLView),其中包含使用可以实时加载的 PVR 图像播放动画的说明。 GLView 库包含一个 GLImageView 类,它的工作方式与 UIImageView 类似,但您可以指定要播放的图像文件名数组,而不必提前加载所有图像。

【讨论】:

感谢尼克(感谢伟大的 iCarousel!)。你能帮我理解 reusingView 参数吗?它是我从 Carousel 获得的指针,应该在那里加载我的子视图,还是我需要用我的视图初始化并将其传递回 Carousel 的指针? iCarousel 可能包含 10,000 个视图,但一次只能看到少数几个视图,因此 iCarousel 不会将 10,000 个视图存储在数组中,或者不断分配释放视图,iCarousel jut 会回收相同的少数视图.每次视图移出屏幕时,它都会被回收并用于在屏幕上滚动的下一个视图。 所以如果reusingView参数为nil,就应该新建一个view并返回。如果 reusingView 参数不为零,您可以忽略它并返回一个新视图,或者您可以重置它的属性(任何特定轮播项目索引所独有的)并返回它。 iCarousel 附带的演示应用程序显示了使用 reusingView 属性的正确方法。注意不要在 if (view == nil) 子句中执行特定于索引的内容的警告。如果有疑问,最好忽略 reusingView 属性,因为使用它的性能优势很小,但很容易用错。 酷。谢谢解释

以上是关于使用 iCarousel ios 重用视图的主要内容,如果未能解决你的问题,请参考以下文章

iCarousel 与 iOS 6.1 中具有标签栏控制器的应用程序集成

表格单元格视图中的 iCarousel 视图根本不滚动

iOS - 在 iCarousel 中添加自定义 UIView

iOS iCarousel 重用不同专辑保留旧专辑信息问题

iCarousel 从 NSMutableArray 加载 UIViews

iOS:iCarousel 中未选择视图的约束