萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> ios >> ios通過按鈕點擊異步加載圖片

ios通過按鈕點擊異步加載圖片

   本文給大家匯總了幾種IOS中實現異步加載圖片的方法,十分的簡單實用,有需要的小伙伴可以參考下。

  比較原始的方法:

  代碼如下:

  AsyncImageView.h:

  #import

  @interface AsyncImageView : UIView

  {

  NSURLConnection* connection;

  NSMutableData* data;

  }

  - (void)loadImageFromURL:(NSURL*)url;

  @end

  AsyncImageView.m:

  #import "AsyncImageView.h"

  @implementation AsyncImageView

  - (id)initWithFrame:(CGRect)frame

  {

  self = [super initWithFrame:frame];

  if(self) {

  // Initialization code

  }

  returnself;

  }

  - (void)loadImageFromURL:(NSURL*)url {

  if(connection!=nil) { [connection release]; }

  if(data!=nil) { [data release]; }

  NSURLRequest* request = [NSURLRequest requestWithURL:url

  cachePolicy:NSURLRequestUseProtocolCachePolicy

  timeoutInterval:60.0];

  connection = [[NSURLConnection alloc]

  initWithRequest:request delegate:self];

  }

  - (void)connection:(NSURLConnection *)theConnection

  didReceiveData:(NSData *)incrementalData {

  if(data==nil) {

  data =

  [[NSMutableData alloc] initWithCapacity:2048];

  }

  [data appendData:incrementalData];

  }

  - (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {

  [connection release];

  connection=nil;

  if([[self subviews] count] > 0) {

  [[[self subviews] objectAtIndex:0] removeFromSuperview];

  }

  UIImageView *imageView = [[[UIImageView alloc] initWithImage:[UIImage imageWithData:data]] autorelease];

  imageView.contentMode = UIViewContentModeScaleAspectFit;

  imageView.autoresizingMask = ( UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight );

  [self addSubview:imageView];

  imageView.frame = self.bounds;

  [imageView setNeedsLayout];

  [self setNeedsLayout];

  [data release];

  data=nil;

  }

  - (UIImage*) image {

  UIImageView* iv = [[self subviews] objectAtIndex:0];

  return[iv image];

  }

  - (void)dealloc {

  [connection cancel];

  [connection release];

  [data release];

  [super dealloc];

  }

  @end

  方法二:

  復制代碼 代碼如下:

  @interface UIButton (AsyncImage)

  //size by point

  - (void)setImageFromURL:(NSString *)urlString adjustToSize:(CGSize)size completion:(void (^)(void))completion logo:(UIImage *)logoImage;

  @end

  @implementation UIButton (AsyncImage)

  - (void)setImageFromURL:(NSString *)urlString adjustToSize:(CGSize)size completion:(void (^)(void))completion logo:(UIImage *)logoImage

  {

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

  UIImage *image = nil;

  NSURL *url = [NSURL URLWithString:urlString];

  NSData *data = [NSData dataWithContentsOfURL:url];

  image = [UIImage imageWithData:data];

  if (image) {

  if (!CGSizeEqualToSize(size, CGSizeZero)) {

  image = [UIImage imageWithCGImage:image.CGImage scale:[self scaleImage:image adjustToSize:size] orientation:image.imageOrientation];

  }

  if (logoImage) {

  image = [self addLogoImage:logoImage toImage:image];

  }

  dispatch_async(dispatch_get_main_queue(), ^{

  [self setImage:image forState:UIControlStateNormal];

  completion();

  });

  }

  else {

  NSLog(@"async load error.");

  }

  });

  }

  // 縮放圖片以適應按鈕大小

  - (CGFloat)scaleImage:(UIImage *)image adjustToSize:(CGSize)size

  {

  CGFloat xScale = size.width / image.size.width;

  CGFloat yScale = size.height / image.size.height;

  return 1.0 / MIN(xScale, yScale);

  }

  - (UIImage *)addLogoImage:(UIImage *)logo toImage:(UIImage *)img

  {

  //get image width and height

  CGFloat scale = [UIScreen mainScreen].scale;

  int w = scale * img.size.width;

  int h = scale * img.size.height;

  int logoWidth = logo.scale * logo.size.width;

  int logoHeight = logo.scale * logo.size.height;

  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

  //create a graphic context with CGBitmapContextCreate

  CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);

  CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);

  CGContextDrawImage(context, CGRectMake(w - logoWidth, 0, logoWidth, logoHeight), [logo CGImage]);

  CGImageRef imageMasked = CGBitmapContextCreateImage(context);

  CGContextRelease(context);

  CGColorSpaceRelease(colorSpace);

  return [UIImage imageWithCGImage:imageMasked scale:scale orientation:img.imageOrientation];

  }

  @end

  方法三:

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #import <Foundation/Foundation.h> #import "StringUtils.h"   @interface ImageManager : NSObject { NSMutableDictionary *_imageDict; NSMutableArray *_imageArr; }   @property(nonatomic, strong) NSString *httpUrl; @property(nonatomic, strong) NSMutableDictionary *imageDict;   @property(nonatomic, assign) dispatch_queue_t networkQueue;   + (ImageManager *) sharedInstance;     - (void)asyncImage:(NSString *)imageName imageView:(UIImageView *)imageView; //插隊 - (void)asyncImageInsert:(NSString *)imageName imageView:(UIImageView *)imageView insert:(BOOL)insert; //不要在下載之前的數據 - (void)asyncImageCleanOld:(NSString *)imageName imageView:(UIImageView *)imageView cleanOld:(BOOL)cleanOld;   @end

  實現文件:

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
copyright © 萬盛學電腦網 all rights reserved