自己定制加载图片并加上转圈圈

//
//  HYBLoadImageView.h
//  CloudShopping
//
//  Created by ljy-335 on 14-8-1.
//  Copyright (c) 2014年 uni2uni. All rights reserved.
//

#import <UIKit/UIKit.h>

/*!
 * @brief 加载图片时,给图片加上转圈圈的状态,让用户知道图片未出现是因为网络不给力而造成的而不是没有图片
 * @author huangyibiao
 */
@interface HYBLoadImageView : UIImageView

// default is showLoading
- (id)initWithFrame:(CGRect)frame;
- (id)initWithFrame:(CGRect)frame showLoading:(BOOL)showLoading;
- (void)setImageWithURLString:(NSString *)urlString placeholder:(NSString *)placeholder;

@end
//
//  HYBLoadImageView.m
//  CloudShopping
//
//  Created by ljy-335 on 14-8-1.
//  Copyright (c) 2014年 uni2uni. All rights reserved.
//

#import "HYBLoadImageView.h"
#import "ASIHTTPRequest.h"
#import "HYBHttpRequestManager.h"
#import "NSString+Common.h"
#import "NSString+Encrypt.h"
#import "NSFileManager+File.h"

@interface HYBLoadImageView () <NSURLConnectionDataDelegate> {
    UIImageView             *_networkStateAnimatingView;
    BOOL                    _showLoading;
    NSMutableData           *_downloadData;
    NSURLConnection         *_urlConnection;
}
@property (nonatomic, copy) NSString *url;

@end

@implementation HYBLoadImageView

- (id)initWithFrame:(CGRect)frame {
    return [self initWithFrame:frame showLoading:YES];
}

- (id)initWithFrame:(CGRect)frame showLoading:(BOOL)showLoading {
    if (self = [super initWithFrame:frame]) {
        _showLoading = showLoading;
        self.contentMode = UIViewContentModeScaleAspectFit;
     }
    return self;
}

- (void)setImageWithURLString:(NSString *)urlString placeholder:(NSString *)placeholder {
    self.image = kImageWithName(placeholder);

    NSString *url = [NSString stringWithFormat:@"%@", urlString];
    if (url.length == 0) {
        return;
    }

    self.url = url;

    if ([[NSFileManager defaultManager] isFileExists:[self imageCachePath]]) {
        if (![[NSFileManager defaultManager] isFile:[self imageCachePath] timeout:24 * 60 * 60]) {
            NSData *data = [[NSData alloc] initWithContentsOfFile:[self imageCachePath]];
            self.image = [UIImage imageWithData:data];
            return;
        }
    }

    _downloadData = [[NSMutableData alloc] init];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
    _urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
    [[HYBHttpRequestManager sharedRequestManager] addRequest:_urlConnection
                                                     withKey:self.url.md5];

    if (_showLoading) {
        if (_networkStateAnimatingView == nil) {
            CGRect frame = CGRectMake((self.frame.size.width - 22) / 2,
                                      (self.frame.size.height - 22) / 2, 22, 22);
            _networkStateAnimatingView = [HYBUIMaker imageViewWithFrame:frame];
            [self addSubview:_networkStateAnimatingView];
            NSMutableArray *imagesArray = [[NSMutableArray alloc] init];
            for (int i = 1; i < 13; i++) {
                NSString *imgName = [NSString stringWithFormat:@"%d.png", i];
                UIImage *image = kImageWithName(imgName);
                [imagesArray addObject:image];
            }
            _networkStateAnimatingView.animationImages = imagesArray;
            _networkStateAnimatingView.animationRepeatCount = 0;
            _networkStateAnimatingView.animationDuration = 1.0 / (13.0 / 8.0);
        }
        [_networkStateAnimatingView startAnimating];
    }
    return;
}

#pragma mark - NSURLConnectionDataDelegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [_downloadData setLength:0];
    return;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [[HYBHttpRequestManager sharedRequestManager] removeRequestWithKey:self.url.md5];

    self.image = [UIImage imageWithData:_downloadData];
    self.alpha = 0;
    [UIView animateWithDuration:0.5 animations:^{
        self.alpha = 1;
    }];
    [_networkStateAnimatingView stopAnimating];
    [_networkStateAnimatingView removeFromSuperview];
    [_downloadData writeToFile:[self imageCachePath] atomically:YES];
    return;
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [[HYBHttpRequestManager sharedRequestManager] removeRequestWithKey:self.url.md5];
    [_networkStateAnimatingView stopAnimating];
    [_networkStateAnimatingView removeFromSuperview];
    return;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [_downloadData appendData:data];
    return;
}

#pragma mark - 获取图片缓存路径
//
- (NSString *)imageCachePath {
   return [NSString stringWithFormat:@"%@/%@", [NSString imageCachePath], self.url.md5];
}

@end
时间: 2024-10-07 01:59:03

自己定制加载图片并加上转圈圈的相关文章

更好的Applet体验:定制加载时画面

你可能已经听说了Java SE 6 Update 10应当会改进Applet体验.你可能已经看过一些可在浏览器中拖拽的Applet示例,但还有比那更多的东西.在本博客系列中,我将向你展示如何在发布Applet时获得尽量多的东西,纵使你不使用Update 10. 摆脱咖啡杯图标 很多人抱怨的第一件事情就是加载Java Applet时使用的咖啡杯图标.根据你具体使用的OS和JVM版本,这个图标是不同的,但它看起来总是像下图那样. 有很多理由可以认为这会困扰到应用程序开发者,包括不能为他们自己的软件标

android 加载图片oom若干方案小结

本文根据网上提供的一些技术方案加上自己实际开发中遇到的情况小结. 众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视手机而定).一般我们可以通过获取当前线程的可运行内存来判断,比如系统分给当前运行内存只有16M,而你的图片就有16M,这肯定会oom的. 相关知识介绍 1.颜色模型 常见的颜色模型有RGB.YUV.CMYK等,在大多数图像API中采用的都是RGB模型,Android也是如此:另外,在Android中还有包含透明度Alpha的颜色模型

Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

异步加载图片的例子,网上也比较多,大部分用了HashMap<String, SoftReference<Drawable>> imageCache ,但是现在已经不再推荐使用这种方式了,因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠.另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应

Android App中使用Glide加载图片的教程_Android

与其他图片加载库相同,Glide除了可以加载网络图片之外,也可以加载本地图片.甚至还可以从各种各样奇葩的数据源中加载图片. 加载网络图片很多情况下,我们使用图片加载库就是为了加载网络图片.网络操作是一个很复杂的东西.试想一下,如果没有图片加载库,我们就要手动去下载图片,缓存图片,最后再从文件里面读取bitmap并设置到Imageview里面.这还算好的,要是在Listview里面你会更头疼的.原因我就不说了,你懂的~~再加上各种各样的Bitmap操作,保准你再也不想撸代码了.而且Bitmap这东

javascript实现瀑布流加载图片原理_javascript技巧

讲一下大概的原理吧,还是先上图:    功能描述: 根据不同菜单的属性值分别加载不同的数据 下拉滚动条到一定位置预加载图片,滚动条拉到最底下的时候渲染html: 鼠标移到菜单,切换各个图片列表: 鼠标移到图片列表上,显示详细信息:  技术实现方案: 先梳理一下从加载到显示的流程: 1. 加载数据 2. 拼接HTML写入到页面 3. 检查刚刚写入的HTML中的img是否全部加载完成,如果是,进入5.否则进入4 4. 等待图片加载完成 5. 计算每个元素的位置 一开始的时候最头疼的是如何定位的问题,

C# PictureBox加载图片并显示进度条

  以前用winform的PictureBox时没有试过加载网络的图片,刚刚看到一段代码才了解到原来还有LoadAsync这个方法,可以异步加载图片,再加上LoadProgressChanged事件也可以获得当前加载的进度. 在窗体上放一个PictureBox控件,一个按钮,一个进度条控件,再用Label来显示当前进度百分比,具体代码如下: private void button1_Click(object sender, EventArgs e)         {             t

RX系列四 | RxAndroid | 加载图片 | 提交表单

RX系列四 | RxAndroid | 加载图片 | 提交表单 说实话,学RxJava就是为了我们在Android中运用的更加顺手一点,也就是RxAndroid,我们还是先一步步来,学会怎么去用的比较好,之前的三篇算是铺垫,让你有一点认识,那Rx在Android中有什么好处呢?我们先模拟一些原始功能和他对比下 一.加载图片 很多人说Rx出来之后,是编程思想的一种进阶,实际上我学习了这种思想之后,确实是觉得有了很大的改变,不过,需要一点学习成本再加上,需要对原先的思想有些改观,使得我依旧有点不适应

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

在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出.针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载上面缓存到本地,以后如果本地有就直接从本地加载.图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略.今天首先介绍一下本地缓存图片. 首先看一下异步加载缓存本地代码: 复制代码 代码如下: public

Android App中使用Glide加载图片的教程

与其他图片加载库相同,Glide除了可以加载网络图片之外,也可以加载本地图片.甚至还可以从各种各样奇葩的数据源中加载图片. 加载网络图片 很多情况下,我们使用图片加载库就是为了加载网络图片.网络操作是一个很复杂的东西.试想一下,如果没有图片加载库,我们就要手动去下载图片,缓存图片,最后再从文件里面读取bitmap并设置到Imageview里面.这还算好的,要是在Listview里面你会更头疼的.原因我就不说了,你懂的~~再加上各种各样的Bitmap操作,保准你再也不想撸代码了.而且Bitmap这