iOSにGif図をロードした正しい姿勢

3442 ワード

昨日何気なく1つの招待状を见て、どのようにgif図をロードすることを书いて、とても面倒な様子を感じて、もともととても简単な1件の事、どうしてこんなに复雑なことをしましたか?~~~
確かに、Appにはダイナミックマップ(gif図)が表示されるところがあります.それはユーザー体験にとって素晴らしいものです.絶対にAppのプラスポイントで、すぐにいくつかの階段を上っています.
But
iOSに表示される画像のコントロールはUIImageViewであることはよく知られていますが、UIImageViewはサポートされていません.gif形式の画像では、gif図を正しくロードするにはどうすればいいのでしょうか.
実は、よく考えてみると、UIImageViewが画像をロードできる以外に、他のシステムコントロールはありませんか?よく考えてみると、もちろんあります!!UIWebView

WebViewで

UIWebViewには、次のような方法があります.
- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;
  • dataはロードするバイナリデータ(NSData)であり、gif図をロードするには、まず画像をNSDataタイプ
  • に変換する必要がある.
  • MIME(Multipurpose Internet Mail Extensions)[1]多目的インターネットメール拡張タイプ.MIMEリファレンスマニュアルでは、image/gif
  • が必要であることがわかります.
  • 符号化フォーマットUTF-8
  • Urlここでは
  • は必要ありません
    では、UIWebViewのこの方法でgif形式のピクチャをロードすることができます.基本的な考え方は、クラス(GifImageView)を作成してUIViewから継承し、GifImageViewでUIWebViewロードgif図を作成することです.これにより、gifをロードすることはUIViewをロードするようにeasyになります.

    コード#コード#

  • GifImageView.h
      #import  
      @interface GifImageView : UIView
      - (id)initWithFrame:(CGRect)frame GifImageName:(NSString*)gitImageName;
      @end
    
  • GifImageView.m
      #import "GifImageView.h"
      @implementation GifImageView
      - (id)initWithFrame:(CGRect)frame GifImageName:(NSString*)gitImageName{
          self = [super initWithFrame:frame];
          if (self) {
              self.backgroundColor = [UIColor clearColor];
              UIView *placeholdView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 1, 1)];
              [self addSubview:placeholdView];
              NSData *gifData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:gitImageName ofType:@"gif"]];
              UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
              [webView setScalesPageToFit: YES];
              [webView setBackgroundColor: [UIColor clearColor]];
              [webView setOpaque: 0];
              [self addSubview:webView];
              [webView loadData:gifData MIMEType:@"image/gif" textEncodingName:@"" baseURL:[NSURL URLWithString:@""]];
              [webView setUserInteractionEnabled:NO];
          }
          return self;
      }
    
  •   ...
      #import "GifImageView.h"
      ...
      
          GifImageView *gifView = [[GifImageView alloc] initWithFrame:CGRectMake(50, 270, 175, 105) GifImageName:@"gifImage"];
          [self.view addSubview:gifView];
      ...
    
  • を使用
  • コードの意味は明確で、私は注釈を書かないで比較的に肝心なのはwebViewのインタラクションを閉じて、スクロール、長押しなどのイベントをトリガすることを防止して、しかしこれは親ビューのインタラクション
  • に影響しません
  • それを除去するのはViewで、もしあなたがそれを除去したいならば、あなたの洪水の力を使いましょう
  • 最後に書く


    このスキームを使用すると、パフォーマンスの問題など、多くの問題が発生するかどうか、私自身が懸念しています.
    gif図があって、1つのAppに彩りを添えることができますが、私は今までどのAppに大量のgif図が展示されているかを発見していません.一般的なプロジェクトには大量のgif図は存在しません(いくつかの主な目的はgif図を展示するAppを除く)、私自身のプロジェクトでも個別の場所でしか使われていないので、このような案を大量に使用することにどのような問題が発生するかは確定できません.
    もちろん、これは唯一の案ではなく、必ずしも最高の案ではありません.もしあなたがこの案に不適切なところがあると思ったら、伝言を歓迎します.もしあなたがもっと良い案があれば、伝言を歓迎して共同で勉強します.
  • ある拡張子を設定したファイルをアプリケーションで開く方式のタイプで、その拡張子ファイルがアクセスされるとブラウザは自動的に指定されたアプリケーションを使用して開く↩