IOSがUIImageViewを使用してgifアニメーションの例を表示する


2つのオープンソースコードが使用されています
1.SDWebImage非同期読取画像データ2.SCGifExample gifアニメーションコントロール
このプロジェクトはSCGifExampleに基づいて修正されました
最近SDWebImageがアップグレードされたばかりで、私もこれによって私のコードを修正しました.gif部分を外して皆さんと画像の拡大縮小部分を共有します.私はまだジェスチャーを使っています.以下の方法はあまり使いにくいと思います.もし皆さんがもっと良いアルゴリズムがあれば、画像の拡大縮小効果を共有してください.
    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
    {
        return imageView;
    }
    
    - (void)scrollViewDidZoom:(UIScrollView *)scrollView
    {
        imageView.center = scrollView.center;
        
        if (imageView.frame.origin.x < 0)
        {
            setFrameX(imageView, 0);
        }
        if (imageView.frame.origin.y < 0)
        {
            setFrameY(imageView, 0);
        }
    }

SDWebImage内部でも実际にはダイナミックな画像読み取りが可能で、私のプロジェクトは时间がなくて変更することができて、兴味があるのは自分で変更してImgeに戻る时にimageArrayに戻ることができて、コードはSCGifExampleの実现を学ぶことができます
SDWebImageにSDWebImageManagerDelegate関数を4つ追加
- (void)webImageManager:(SDWebImageManager *)imageManager ActivityIndicatorView:(UIActivityIndicatorView *)activityIndicatorView didFailWithError:(NSError *)error; - (void)webImageManager:(SDWebImageManager *)imageManager ActivityIndicatorView:(UIActivityIndicatorView *)activityIndicatorView didFinishWithImage:(UIImage *)image drawRoundedRect:(BOOL)bDraw; //SDImageCacheにデータがあります-(void)webImageManager:(SDWebImageManager*)imageManager Activity IndicatorView:(UIActivity IndicatorView*)activityIndicatorView:(NSString*)fileName didFinishWithImage:(UIImge*)image drawRoundedRect:(BOOL)bDraw;//SDImageCacheにはデータがなく、SDWebImageDownloaderダウンロード取得-(void)webImageManager:(SDWebImageManager*)imageManager Activity IndicatorView:(UIActivity IndicatorView*)activityIndicatorView ImageData:(NSData*)imageData didFinishWithImage:(UIImage*)image drawRoundRect:(BOOL)bDraw;(UIActivityIndicatorView*)activityIndicatorViewは、ImageViewでSDWebImageManagerが呼び出されたときにロードされたダウンロードステータスを表示します.
typedef enum {     SDWebImageRetryFailed = 1 << 0,     SDWebImageLowPriority = 1 << 1,     SDWebImageCacheMemoryOnly = 1 << 2,     SDWebImageRoundedRect = 1 << 3 } SDWebImageOptions; には、フィレット画像を表示するかどうかを示すSDWebImageRoundedRectが追加されています.
SCGifExampleは2つの関数を追加しました
- (BOOL)setGIFFile:(NSString*)gifFilePath; - (BOOL)setGIFData:(NSData*)gifImageData;
ステータスバーとツールバーはまだ終わっていません.ステータスバーはカスタマイズしたほうがいいです.
2012-03-16:1つの問題を発見しました.UIActivityIndicatorViewを自分で修正してください.繰り返し作成する可能性があります.できることは下を見る必要はありません.私はパッチを打っただけです.次のように修正しました.
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options
{
    SDWebImageManager *manager = [SDWebImageManager sharedManager];
     
    // Remove in progress downloader from queue
    [manager cancelForDelegate:self];
     
    self.image = placeholder;
     
    if (url)
    {
        UIActivityIndicatorView *progressInd = (UIActivityIndicatorView *)[self viewWithTag:30326];
         
        if (progressInd == nil)
        {
            progressInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
            progressInd.tag = 30326;
            [progressInd startAnimating];
            [self addSubview:progressInd size:CGSizeMake(37, 37)];
         
            [progressInd release];
        }
         
        //[manager downloadWithURL:url delegate:self options:options];
        [manager downloadWithURL:url ActivityIndicatorView:progressInd delegate:self options:options];
    }
}

3月23日:
SDWebImageの内部に問題があり、URLリンクがimageでない場合はimage画像データを返します.
可以在
NS_INLINE UIImage *SDScaledImageForPath(NSString *path, NSData *imageData)
関数にimageDataの判断を追加し、ピクチャデータかどうか
非常時にnilを返す
- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection
関数の値がdelegate呼び出しperformSelector:@selector(imageDownloader:didFailWithError:)を返すと判断します.
ダウンロードアドレス:ダウンロードをクリック
新版:ダウンロードをクリック
最近SDWebImageの変更が頻繁で、コードも統合してdelegateを簡略化しました.
Button部分の変更が追加され、前景背景の異なる状態の画像を設定できます
私は工事をやめて、SDWebImage部分だけアップロードします.
ダウンロード:SDWebImage_2.6_b78238802d.zip
久しぶりに新しいSDWebImageに大きな問題があり、ダウンロードスレッドがランダムにブロックされ、画像がダウンロードできなくなります.
古いバージョンのそれは問題なくgifを増やせばいいです.
gifアルゴリズムを追加:
sd_isGIFは新版SDWebImageにあります
- (BOOL)animatedGIFWithData:(NSData *)data
{
    if (!data)
    {
        return NO;
    }
    
    if (![data sd_isGIF])
    {
        return NO;
    }
    
    CGImageSourceRef source = CGImageSourceCreateWithData(( CFDataRef)data, NULL);
    
    size_t count = CGImageSourceGetCount(source);
    NSMutableArray *images = [NSMutableArray array];
    
    NSTimeInterval duration = 0.0f;
    
    for (size_t i = 0; i < count; i++)
    {
        CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
        
        NSDictionary *frameProperties = CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(source, i, NULL));
        duration += [[[frameProperties objectForKey:(NSString*)kCGImagePropertyGIFDictionary] objectForKey:(NSString*)kCGImagePropertyGIFDelayTime] doubleValue];
        
        [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];
        
        CGImageRelease(image);
    }
    
    CFRelease(source);
    
    if (!duration)
    {
        duration = (1.0f/10.0f)*count;
    }
    
    if (images.count > 0)
    {
        [self setImage:[images objectAtIndex:0]];
        [self setAnimationImages:images];

        [self setAnimationDuration:duration];
        [self setAnimationRepeatCount:0];
        [self startAnimating];
        
        return YES;
    }
    
    return NO;
}