延迟加载UIScrollView或UITableView

时间:2014-02-14 11:53:20

标签: ios objective-c uitableview uiscrollview lazy-loading

我正在寻找一些建议。我正在构建一个照片编辑应用程序,需要在屏幕上水平显示缩略图(20+)。每个缩略图都是通过将小图像传递到GPUImage然后使用线程在屏幕上显示来创建的。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

                UIImage *imageWithEffect = [self editImage:[obj objectAtIndex:0] ImageToEdit:thumbnailImage];

                    dispatch_async(dispatch_get_main_queue(), ^{

                         [imageViewWithEffect setImage:imageWithEffect];
                         [activityIndicator removeFromSuperview];

                    });

            });

目前我使用UIScrollView来显示图像,但我发现处理所有图像需要一段时间。当用户将UIImageView滑入视图时,我想要做的是“延迟加载”图像。问题是我不确定如何查找当前正在查看的图像。

有些人提到使用UITableView可能更容易。有人可以提供一些建议吗?

由于

2 个答案:

答案 0 :(得分:2)

根据您希望如何显示数据(例如图片+标题+有关图片的详细信息,或者只是简单的普通图像视图),确实更容易选择UITableView或UICollectionView,因为这个延迟加载是默认的,这两个类的内置和难以避免的行为。

它们都是可滚动的并且显示可以通过StoryBoard设计的单元格(UITableViewCell或UICollectionViewCell)(即:在那里添加一个imageView,下面是一个标签......)并使用委托模式懒洋洋地询问控制器该怎么做当一个单元格即将到达屏幕时显示。

假设您希望使用collectionView(然后可以在网格状布局中显示几个imageView),但tableView将以相同的方式工作99%。 首先要做的是将collectionView添加到StoryBoard并在collectionView中添加一个UICollectionViewCell并使用您自己的设计进行自定义(即在里面添加一个imageView)。您的collectionView可以包含多个单元格设计(只有一个imageView用于普通图像,一个带有“新”功能区的imageView用于新添加的图像,一个带有“最后编辑的”textView用于编辑图像的imageView)虽然你应该给(仍然在storyBoard)每个设计的唯一标识符,在每个设计中为每个单元的UI组件设置标记值。

完成布局后,将场景控制器声明为collectionView的数据源,并通过实现方法符合UICollectionViewDataSource协议

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section;

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;

第一个必须返回要显示的图像总数(以便底层滚动视图可以缩放它的内容大小),第二个是返回要在给定indexPath处显示的单元格,这是基本上是一个包含项索引和节索引的包装类。 当一个单元格即将出现在屏幕上时,第二种方法被称为懒惰,因此在此方法中,您可以根据indexPath.item值(作为要显示的图像的索引)检索缩略图图像,获取具有StoryBoard通过将- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;发送到collectionView来定义设计。通过将-(UIVIew *)viewWithTag:(NSInteger)tag消息发送到前一方法返回的单元格,然后将其text / image属性设置为要向用户显示的内容,按标记值获取单元格的设计元素。

这对你的答案来说是一种相当重要的方法,我很乐意在技术上帮助你证明是必要的。

干杯,

答案 1 :(得分:0)

使用 Tableview ,这对此更灵活。您可以轻松地轻松加载和选择。此外,我建议 UICollectionView 。它对此也更有用。

scrollview问题:在滚动之前,您需要一次添加和加载所有图片,这会让您的应用变慢。根据您的要求,Frame calculation也有点复杂。