問題描述
我使用 AssetsLibrary 獲得了所有 iphone 圖像.我在 imageview 中傳遞 UIImage 對象并在滾動視圖中顯示圖像.iphone 中有 200 多張圖像,我必須在不使用分頁的情況下垂直顯示滾動視圖中的所有圖像.這需要大量時間來顯示圖像,并且還存在內存問題.是否有任何代碼可以在滾動視圖中延遲加載 iphone 圖像
I have got all images of iphone using AssetsLibrary.I am passing UIImage object in imageview and display images in scrollview. There are more than 200 images in iphone and i have to display all images in scrollview vertically without use of paging.This takes lots of time to display images and it has also memory issues. Is there any code for lazy loading of iphone images in scrollview
推薦答案
我最近一直在研究這個問題,并查看了網絡上的大量示例代碼.沒有一個真正做到延遲加載(盡管聲稱)或具有比我愿意忍受的更復雜(不必要的花里胡哨).PhotoPicker 的 Apple WWDC 視頻似乎顯示延遲加載,但似乎更側重于預切片圖像的平鋪,因此沒有太大幫助.
I've been working on this recently and have checked out loads of example code on the web. None of it really did lazy loading (despite the claim) or had much more complexity (needless bells and whistles) than I was willing to put up with. The Apple WWDC videos for PhotoPicker appear to show lazy loading but seem more focused on tiling of pre-sliced up images, so not much help there.
我最終做的是一次加載所有 aspectThumbnails
,因為它們很小并且不占用那么多內存,然后加載 fullScreenImage
scrollViewDidEndDecelerating
按需表示并重新加載 aspectThumbnail
以使 imageView 離開屏幕.效果非常流暢和視覺上,圖像有點粗糙,然后很快(通過背景加載)被更高分辨率的圖像替換.
What I've ended up doing is to load all the aspectThumbnails
at once, since they are small and don't take up that much memory and then load the fullScreenImage
representation on demand from scrollViewDidEndDecelerating
and reload the aspectThumbnail
for the imageView going off-screen. The effect is very fluid and visually, the image comes in a little rough and then quickly (through background loading) is replaced with the higher resolution image.
它可能會使用更多的細化 - 可能會為 currentPage +1 加載全分辨率圖像 &-1.我還沒有解決這個問題.此外,我不完全確定我對塊的使用是否處于最佳狀態——但沒有出錯.
It can probably use more refinement - perhaps loading full resolution images for the currentPage +1 & -1. I haven't got around to that as yet. Also, I'm not entirely sure if my use of blocks in optimal – but not getting an errors.
我從 Segue 調用它并在我的根 viewController 上的 prepareForSegue:
方法中設置 assetsArray
(ALAssets 的 NSArray).
I call this from a Segue and set the assetsArray
(NSArray of ALAssets) from within the prepareForSegue:
method on my root viewController.
// ScrollViewController.h
#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>
@interface ScrollViewController : UIViewController <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (strong, atomic) ALAssetsLibrary* assetLibrary;
@property (nonatomic,strong)NSMutableArray* assetsArray;
@end
//ScrollViewController.m
//ScrollViewController.m
#import "ScrollViewController.h"
@interface ScrollViewController ()
@property (nonatomic,assign) CGSize currentImageSize;
@property (nonatomic, assign)int currentPages;
@property (nonatomic, assign)int currentPageNum;
@property (nonatomic, strong)UIImage* placeHolder;
@end
@implementation ScrollViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//self.placeHolder = [UIImage imageNamed:@"loader.jpg"];
self.scrollView.delegate = self;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (self.assetsArray != nil) {
self.currentPages = [self.assetsArray count];
CGSize size = self.scrollView.frame.size;
int num = self.currentPages;
self.scrollView.contentSize=CGSizeMake(size.width*num, size.height);
[self loadThumbnails];
self.currentPageNum = 0;
[self loadFullScreenImageByIndex:self.currentPageNum];
}
}
-(void)loadThumbnails
{
int pageCount = self.currentPages;
CGSize size = self.scrollView.frame.size;
self.scrollView.contentSize=CGSizeMake(size.width*pageCount, size.height);
for (int i = 0; i < pageCount; i++) {
ALAsset *asset = [self.assetsArray objectAtIndex:i];//
CGRect imageViewFrame;
// x offset is determined by arrayIndex
imageViewFrame.origin.x = self.scrollView.frame.size.width * i;
imageViewFrame.origin.y = 0;
imageViewFrame.size = self.scrollView.frame.size;
self.currentImageSize = imageViewFrame.size; // THIS IS WRONG
UIImage *image = [[UIImage alloc] initWithCGImage:asset.aspectRatioThumbnail];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.clipsToBounds = YES;
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.frame = imageViewFrame;
imageView.tag = i+1;// start tags at 1
[self.scrollView addSubview:imageView];
}
}
- (void)viewDidUnload {
[self setScrollView:nil];
[super viewDidUnload];
}
- (void)loadFullScreenImageByIndex:(int)index
{
int arrayIndex = index;
int tagNumber = index+1;
ALAsset *asset = [self.assetsArray objectAtIndex:arrayIndex];
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
UIImage *tmpImage = [[UIImage alloc] initWithCGImage:asset.defaultRepresentation.fullScreenImage];
__strong __typeof__(weakSelf) strongSelf = weakSelf;
if ([strongSelf.scrollView viewWithTag:tagNumber] != nil){
dispatch_async(dispatch_get_main_queue(), ^{
__strong __typeof__(weakSelf) strongSelf = weakSelf;
if ([strongSelf.scrollView viewWithTag:tagNumber]!= nil){
UIImageView * tmpImageView = (UIImageView*)[strongSelf.scrollView viewWithTag:tagNumber];
tmpImageView.image = tmpImage;
}
});
}
});
}
- (void)loadThumbnailImageByIndex:(int)index
{
int arrayIndex = index;
int tagNumber = index+1;
ALAsset *asset = [self.assetsArray objectAtIndex:arrayIndex];//
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
UIImage *tmpImage = [[UIImage alloc] initWithCGImage:asset.aspectRatioThumbnail];
__strong __typeof__(weakSelf) strongSelf = weakSelf;
if ([strongSelf.scrollView viewWithTag:tagNumber] != nil){
dispatch_async(dispatch_get_main_queue(), ^{
__strong __typeof__(weakSelf) strongSelf = weakSelf;
if ([strongSelf.scrollView viewWithTag:tagNumber]!= nil){
UIImageView * tmpImageView = (UIImageView*)[strongSelf.scrollView viewWithTag:tagNumber];
tmpImageView.image = tmpImage;
}
});
}
});
}
- (void)manageImages
{
int currentPage = (self.scrollView.contentOffset.x / self.currentImageSize.width);
if (currentPage != self.currentPageNum){
[self loadThumbnailImageByIndex:self.currentPageNum]; //pg no longer visible so load thumb
[self loadFullScreenImageByIndex:currentPage]; // load full
self.currentPageNum = currentPage;// store
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self manageImages];
}
這篇關于uiscrollview 懶加載的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!