ios通过按钮点击异步加载图片

奇宜爱好

奇宜爱好

2016-02-19 11:31

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的ios通过按钮点击异步加载图片懂设计的网友们快点来了解吧!

比较原始的方法:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

代码如下:

AsyncImageView.h:
#import UIKit/UIKit.h
@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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

方法三:

#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

实现文件:

//// ImageManager.m// myb-ios//// Created by warrior gao on 13-6-5.// Copyright (c) 2013年 51myb. All rights reserved.//#import "ImageManager.h"@interface ImageManager()@end@implementation ImageManager//缓存图片的最大数量static int counter = 0;@synthesize imageDict = _imageDict;//Singleton + (ImageManager *)sharedInstance{  static id instance;  static dispatch_once_t onceToken;  dispatch_once(&onceToken, ^{instance = self.new;  });  return instance;}- (id)init{  if((self = [super init]))  {self.networkQueue = dispatch_queue_create("com.warrior.network.image", nil);_imageDict = [[NSMutableDictionary alloc] init];_imageArr = [[NSMutableArray alloc] init];  }  return self;}- (NSString *) fileFullPath:(NSString *)fileName{  NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];NSString *fileFullPath = [NSString stringWithFormat:@"%@/%@",cachePath,fileName];return fileFullPath;}//不要在下载之前的数据- (void)asyncImageCleanOld:(NSString *)imageName imageView:(UIImageView *)imageView cleanOld:(BOOL)cleanOld{  if(cleanOld)  {[_imageArr removeAllObjects];  }[self asyncImage:imageName imageView:imageView];}//插队,优先- (void)asyncImageInsert:(NSString *)imageName imageView:(UIImageView *)imageView insert:(BOOL)insert{  if([StringUtils isEmpty:imageName]){return;  }NSData *data = [NSData dataWithContentsOfFile:[self fileFullPath:[imageName stringByReplacingOccurrencesOfString:@"/" withString:@"-"]]];  if(data == nil){[_imageDict setValue:imageView forKey:imageName];if(insert){  [_imageArr insertObject:imageName atIndex:0];}else{  [_imageArr addObject:imageName];}[self cacheImage];  } else {[imageView setImage:[UIImage imageWithData:data]];  }}//正常,附加到后面- (void)asyncImage:(NSString *)imageName imageView:(UIImageView *)imageView{  [self asyncImageInsert:imageName imageView:imageView insert:NO];}//异步缓存图片到本地,最多有两个线程-(void)cacheImage{  for (; counter  2 && _imageArr.count  0; counter++)  {NSString *imageName = nil;@synchronized(self){  imageName = [[_imageArr objectAtIndex:0] copy];  [_imageArr removeObjectAtIndex:0];}if(imageName == nil) continue;dispatch_async(self.networkQueue, ^{NSLog(@"Starting: %@", imageName);  UIImage *avatarImage = nil;  NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",self.httpUrl, imageName]];  NSData *responseData = [NSData dataWithContentsOfURL:url];  if(responseData.length  0)  {[responseData writeToFile:[self fileFullPath:[imageName stringByReplacingOccurrencesOfString:@"/" withString:@"-"]] atomically:NO];avatarImage = [UIImage imageWithData:responseData];NSLog(@"Finishing: %@", imageName);  if (avatarImage) {  dispatch_async(dispatch_get_main_queue(), ^{UIImageView *imageView = [_imageDict objectForKey:imageName];if(imageView != nil && avatarImage != nil){[imageView setImage:avatarImage];}  [_imageDict removeObjectForKey:imageName];[imageName release];  });}  }  counter--;  [self cacheImage];});  }}@end

以上所述就是本文的全部内容 了,希望大家能够喜欢。

展开更多 76%)
分享
qqQQ
qzoneQQ空间
weibo微博

猜你喜欢

ios通过按钮点击异步加载图片

编程语言 网络编程
ios通过按钮点击异步加载图片

ListView异步加载图片实现思路

编程语言 网络编程
ListView异步加载图片实现思路

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

ListView异步加载图片实现思路(优化篇)

编程语言 网络编程
ListView异步加载图片实现思路(优化篇)

android异步加载图片并缓存到本地实现方法

编程语言 网络编程
android异步加载图片并缓存到本地实现方法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

IOS中实现图片点击全屏预览

编程语言 网络编程
IOS中实现图片点击全屏预览

VB精彩教程:数据异步加载

编程语言 网络编程
VB精彩教程:数据异步加载

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

ios开发中时间转换的方法集锦

ios开发中时间转换的方法集锦

MAC卸载删除Xcode开发软件的技巧

MAC卸载删除Xcode开发软件的技巧
下拉加载更多内容 ↓