UITableView의 지연로드 이미지
내 UITableView
. URL에서 이미지를 가져 오는 셀에 이미지와 레이블을 표시하고 싶습니다.
이미지가로드되는 동안 UI가 멈추지 않도록 이미지를 지연로드하고 싶습니다. 별도의 스레드에서 이미지를 가져 오려고했지만 셀이 다시 표시 될 때마다 각 이미지를로드해야합니다 (그렇지 않으면 셀을 재사용하면 오래된 이미지가 표시됨). 누군가이 동작을 복제하는 방법을 알려주십시오.
시도 AFNetworking 이 링크에서 클래스 다운로드이 클래스를 https://github.com/AFNetworking/AFNetworking . 프로젝트에 모든 AFNetworking 클래스를 추가 한 다음이 범주를 가져옵니다.
#import "UIImageView+AFNetworking.h" in your Viewcontroller which contains your Tableview.
그런 다음 cellForRowAtIndexPath 에서 다음 과 같이 입력하십시오.
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil)
{
cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
[cell.imageView setImageWithURL:[NSURL URLWithString:[UrlArray objectAtIndex:indexPath.row]] placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]];
cell.myLabel.text = [imageNameArray objectAtIndex:indexPath.row];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
이것은 UITableviewcell 에서 imageView에 대한 이미지를 비동기 적으로 다운로드합니다 . 캐시도 있기 때문에 사용자가 Tableview를 스크롤하는 동안 반복해서 다운로드하지 않습니다. 이미지를 다운로드하면 imageUrl의 키로 이미지를 저장합니다. 도움이 되었기를 바랍니다.
NSOperation을 수행하고 다른 스레드에서 필요한 모든 작업을 수행하는 것이 좋습니다.
이것은 이미지 로딩을 위해 작성한 클래스입니다.
- (id)initWithTarget:(id)trgt selector:(SEL)sel withImgURL:(NSString *)url {
if(self = [super init]) {
if(url == nil || [url isEqualToString:@""])
return nil;
target = trgt;
action = sel;
imgURL = [[NSURL alloc] initWithString: url];
}
return self;
}
- (void)main {
[NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
}
- (void)loadImage {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *img = [UIImage imageNamed: @"default_user.png"];
if(![[imgURL absoluteString] isEqualToString: @"0"]) {
NSData *imgData = [NSData dataWithContentsOfURL: imgURL];
img = [UIImage imageWithData: imgData];
}
if([target respondsToSelector: action])
[target performSelectorOnMainThread: action withObject: img waitUntilDone: YES];
[pool release];
}
- (void)dealloc {
[imgURL release];
[super dealloc];
}
도움이 되었기를 바랍니다.
자아 이미지 버튼을 사용할 수 있습니다. github에서 자아 이미지 버튼 파일을 다운로드 할 수 있습니다. 프로젝트에 추가합니다 ....
xib의 이미지보기에서 "자아 이미지 버튼"클래스를 변경하십시오.
지연 로딩을 동기 요청이라고합니다.
자아 이미지를 비동기 요청이라고합니다. 자아 이미지는 응답을 기다리지 마십시오 .. 한 번에 모든 이미지를 표시합니다 ..
Maybe you can have a try ALImageView.It is much simpler than SDWebImage.You only need two source files(ALImageView.h/ALImageView.m).You can reuse the image view to reload different urls in a tableview cell.
- Support local and memory cache;
- Support place holders;
- Support tap touch(target-action);
- Support corner for the image view;
There is also a good demo.
you can try this lazyTableImages ,
i had customized lazyTableImages this project into a very simple one (customizeLazyTableImages ) and removed all extra codes with some static urls and titles only this is loading images very smoothly and caching them
I think there is another way to solve that problem if you want to load that image then at the start of the view thats mean
when -(void)loadView
is loading, then just allocate these images and take it into a nsarray
now when table cell is loading then make your view at the table cell and according to the indexPath.row
just replace these images of nsarray
into that view as a background image or make subview of these images on that new view of tablecell using nsarray
index and indexPath.row
of the tableview cell.
You can use the NSOperation queue or GCD for loading images in the background.
If you don't want to load images again and again, you can use NSCache or the file system for storing the images.
I am not aware of any built in way to accomplish this but it sounds like you have something working with another thread already.
Assuming that your only remaining problem now is invalidating the contents of a cell when it comes back into view you should look at:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
By implementing this delegate method you could check the contents of the cell before it draws to see if it needs new contents. If it does then you could empty the cells contents and trigger your threaded loading again.
You might also consider posting some code.
참고URL : https://stackoverflow.com/questions/1130089/lazy-load-images-in-uitableview
'developer tip' 카테고리의 다른 글
그렇게 오래 걸리는 Symfony 방화벽은 무엇입니까? (0) | 2020.12.13 |
---|---|
div 아래 / 뒤의 콘텐츠를 흐리게 할 수 있습니까? (0) | 2020.12.13 |
Perl 개발을위한 이상적인 Vim 구성에 대한 제안은 무엇입니까? (0) | 2020.12.13 |
추상 C # 클래스에서 추상 생성자를 만들 수없는 이유는 무엇입니까? (0) | 2020.12.12 |
잭슨 : 부동산이 없으면 어떻게 되나요? (0) | 2020.12.12 |