2017-04-07 5 views
1

Kürzlich unsere App benötigen einen Ersatz in Bildabruflogik, so dass Client sollte ein Bild mit seiner Größe anfordern (Bild wird vom Server aufgebaut dynamisch).iOS Bild lädt von URL Spezifizierungs Größe

Bild-URL hat folgendes Format: http://image.server.url/path?width={{width}}&height={{height}}

Die meisten der benutzerdefinierten Ansichten werden in dem folgenden Muster aufgebaut:

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

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

Und es wird instanziiert wie:

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

Diese war kein Problem (da die Größe aller Bilder statisch ist), aber wenn ein Bild mit dynamischer Größe angefordert wird, ist es nicht verfügbar, weil es als Bild fetchi ng wird ausgeführt, bevor -layoutSubviews aufgerufen wird, die Größe des Zielbildcontainers ist immer Null.

Schließlich müssen wir den Zeitpunkt herauszufinden, wenn das Layout abgeschlossen ist (Beobachter unter Verwendung von für die Bild Behälter) oder haben statische Größe für alle Bild Containern.

Was wäre die beste Lösung dafür sein?

+0

Die beste Lösung wäre, Netzwerk-Assets asynchron zu laden, dh. Sobald der Download abgeschlossen ist, aktualisieren Sie Ihre Benutzeroberfläche mit "Was ist wirklich real". In der Praxis bedeutet dies, dass während des Ladens der Netzwerkressourcen entweder eine animierte Fortschrittsgrafik ("loading! Wait!") Oder ein Platzhalter-Asset (Grafik mit niedriger Auflösung, während Sie die echte Grafik erhalten) angezeigt wird. – xaphod

Antwort

0

Ich glaube, dass vielleicht brauchen Sie nicht „exakt“ Größe des Bildes, weil Bild nach oben skaliert werden könnte oder unten. Meiner Meinung nach brauchen Sie nahe genug Größe des Bildes. Da (wie ich vermute) die Bildgröße durch die Bildschirmgröße bestimmt wird (was durch das Gerät bestimmt wird), könnten Sie die Funktion für Bilder vorbereiten, die die richtige Größe für das richtige Gerät liefern.

können Sie wissen, ab Front der Größen für iPhone 4, iPhone 5, .... und dann korrekte Größe des Bildes geladen werden (die Containerladung nach layoutSubviews sein wird)

zweite Idee ist (wie xaphod Erwähnung) dass Sie beim Herunterladen der App alle Größen laden und dann die richtige Größe in layoutSubviews laden. Aber Vorsicht, wenn es viele Bilder in vielen Größen gibt, dann könnte dies ein sehr großer Platzverbrauch für Bilder sein, die niemals in einer App platziert werden.

0

Bild lädt von URL Größe auch spezifizieren, entsprechend iPhone Gerätegröße.

Hier ist das Beispiel, das ich verwendet haben. Leider ist es in Swift aber mach dir keine Sorgen darüber wird es die Grundidee geben, wie man mit objective-c. Auch die wichtigsten Dinge sind nach der Größe der Geräte Bild herunterladen.

Klasse erstellen

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))")! 
    } 

} 

Nutzungs

Sie Werte entsprechend Ihrer Verwendung ändern können. UIScreen.mainScreen(). Scale line gibt Ihnen die Bildgröße für Ihr Gerät.