2017-04-07 9 views
1

最近、私たちのアプリケーションは、クライアントが画像を要求するように画像取り込みロジックを置き換える必要があります(画像はサーバーから動的に構築されます)。iOS画像サイズを指定したURLから画像を読み込みます

画像のURLの形式は次のとおりです。 カスタムビューのほとんどは、以下のパターンで構築されているhttp://image.server.url/path?width={{width}}&height={{height}}

- (instancetype)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) { 
     // do some initializations 
    } 
    return self; 
} 

- (void)setImageURL:(NSURL *)URL { 
    // do image fetching 
} 

そして、それは次のようにインスタンス化されています

SomeView *view = [[SomeView alloc] init]; 
view.imageURL = [NSURL URLWithString:@"..."]; 
[self addSubview:view]; 

この(すべての画像のサイズが静的であるため)問題ではありませんでしたが、動的サイズの画像を要求することはできませんでした。なぜなら、画像のフェッチ-layoutSubviewsが呼び出される前に実行され、ターゲットイメージコンテナのサイズは常にゼロです。

結局のところ、レイアウトが完了した時点(画像コンテナのためのオブザーバを使用して)、またはすべての画像コンテナの静的サイズを把握する必要があります。

これには最適な解決策はありますか?

+0

ベスト・ソリューションは、ネットワーク・アセットを非同期的にロードすることです。ダウンロードが完了したら、UIを「本当に本当のもの」で更新します。実際には、これは、ネットワークアセットがロードされている間に、アニメーション進行グラフィック(「ロード待ち!」)またはプレースホルダーアセット(実際のものを取得している間に低解像度のグラフィック) – xaphod

答えて

0

私は、イメージが拡大または縮小される可能性があるため、イメージの「正確な」サイズは必要ないと考えています。私の意見では、十分に近い大きさのイメージが必要です。イメージサイズは画面サイズ(デバイスによって決まります)によって決まるため、正しいデバイスの正しいサイズを返すイメージ用の関数を用意することができます。

あなたはABフロントiPhone 4、iPhone 5用のサイズ....を知っているし、その後xaphodの言及として(

セカンドアイデアがある(コンテナがlayoutSubviews後負荷になります)画像の正しいサイズを読み込むことができます)あなたは、アプリケーションがダウンロードされたときにすべてのサイズを読み込んだ後、layoutSubviewsで正しいサイズを読み込みます。しかし、多くのサイズの画像がたくさんある場合は、決してアプリに配置されない画像のための巨大なスペース消費である可能性があることに注意してください。

0

サイズを指定してURLから画像をロードするまた、iPhoneのデバイスのサイズに合わせてください。

ここでは、私が使っている例です。残念ながら、それはSwiftにありますが、これについて心配するのではなく、目的とする方法の基本的な考え方を与えるでしょう。また、主なものは、デバイスサイズのイメージのダウンロードによるものです。

クラス

import UIKit 

public class ImageService: NSObject { 

    public enum ImageMode:String { 
      case Uniform = "Uniform" 
      case Zoom = "Zoom" 
      case Pad = "Pad" 

    var description : String { 
     get { 
      return self.rawValue 
     } 
    } 
    } 
    public func buildImageString(imageName:String, imageMode:ImageMode, size:CGSize, scale:CGFloat)-> NSURL{ 
     return NSURL(string: MonsciergeCoreKit.repository().apiRoot + "/v1/Images?imagePath=\(imageName)&mode=\(imageMode.description)&width=\(Int(size.width * scale))&height=\(Int(size.height * scale))")! 
    } 

} 

あなたは、あなたの使用状況に応じて値を変更することができます

使用法を作成します。 UIScreen.mainScreen()。尺度線は、お使いのデバイスに応じたイメージサイズを提供します。

let url = ImageService().buildImageString("ImageName", imageMode: .Zoom, size:CGSizeMake(self.view.frame.size.width, headerHeight), scale:UIScreen.mainScreen().scale) 
関連する問題