android scrollview 懒加载图片,Uiscrollview懒加载

我一直对这个最近和已签出的示例代码加载在网络上。没有一个是真正的懒惰加载(尽管声称)或更复杂(不必要的钟声和哨声)比我愿意忍受。 PhotoPicker的Apple WWDC视频似乎显示延迟加载,但似乎更侧重于预先切片图像的平铺,因此没有多大帮助。

我已经结束了做什么是所有aspectThumbnails一次加载,因为它们体积小,不占用这么大的内存,然后从scrollViewDidEndDecelerating按需加载的fullScreenImage表示并重新加载aspectThumbnail的ImageView的不在屏幕上。效果非常流畅和直观,图像稍微粗糙,然后快速(通过背景加载)替换为更高分辨率的图像。

它可能会使用更多的细化 - 也许加载当前页面的全分辨率图像+1 & -1。到目前为止我还没有做到这一点。另外,我并不完全确定我是否使用了最佳模块 - 但没有发现错误。

我从Segue中调用此函数,并在我的根视图控制器的prepareForSegue:方法中设置assetsArray(ALAssets的NSArray)。

// ScrollViewController.h

#import

#import

@interface ScrollViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;

@property (strong, atomic) ALAssetsLibrary* assetLibrary;

@property (nonatomic,strong)NSMutableArray* assetsArray;

@end

//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];

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值