• 爱情文章
  • 亲情文章
  • 友情文章
  • 生活随笔
  • 校园文章
  • 经典文章
  • 人生哲理
  • 励志文章
  • 搞笑文章
  • 心情日记
  • 英语文章
  • 范文大全
  • 作文大全
  • 新闻阅读
  • 当前位置: 山茶花美文网 > 作文大全 > 正文

    【ios通过按钮点击异步加载图片】 点击按钮加载更多内容

    时间:2020-05-12来源:山茶花美文网 本文已影响 山茶花美文网手机站

    本文给大家汇总了几种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

    • 【ios通过按钮点击异步加载图片】 点击按钮加载更多内容 相关文章:
    • 爱情文章
    • 亲情文章
    • 友情文章
    • 随笔
    • 哲理
    • 励志
    • 范文大全