使用 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 中具有标签栏控制器的应用程序集成
iOS - 在 iCarousel 中添加自定义 UIView