Ich habe eine URL für ein Bild (habe sie von UIImagePickerController erhalten), aber ich habe das Bild nicht mehr im Speicher (die URL wurde aus einer früheren Ausführung der App gespeichert). Kann ich das UIImage erneut von der URL laden?
Ich sehe, dass UIImage ein imageWithContentsOfFile hat: aber ich habe eine URL. Kann ich die DataWithContentsOfURL: von NSData verwenden, um die URL zu lesen?
EDIT1
basierend auf @ Daniels Antwort habe ich den folgenden Code ausprobiert, aber er funktioniert nicht ...
NSLog(@"%s %@", __PRETTY_FUNCTION__, photoURL);
if (photoURL) {
NSURL* aURL = [NSURL URLWithString:photoURL];
NSData* data = [[NSData alloc] initWithContentsOfURL:aURL];
self.photoImage = [UIImage imageWithData:data];
[data release];
}
Wenn ich es ausgeführt habe, zeigt die Konsole:
-[PhotoBox willMoveToWindow:] file://localhost/Users/gary/Library/Application%20Support/iPhone%20Simulator/3.2/Media/DCIM/100APPLE/IMG_0004.JPG
*** -[NSURL length]: unrecognized selector sent to instance 0x536fbe0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL length]: unrecognized selector sent to instance 0x536fbe0'
Wenn ich mir den Aufrufstapel anschaue, rufe ich URLWithString auf, das URLWithString: relativeToURL:, dann initWithString: relativeToURL:, dann _CFStringIsLegalURLString, dann CFStringGetLength, dann forwarding_prep_0 , dann forwarding , dann - [NSObject doesNelRecize.
Irgendwelche Ideen, warum mein NSString (die Adresse von photoURL ist 0x536fbe0) nicht auf die Länge reagiert? Warum sagt es, dass es nicht auf - [NSURL-Länge] reagiert? Weiß es nicht, dass param ein NSString ist, kein NSURL?
EDIT2
OK, das einzige Problem mit dem Code ist die Konvertierung von Zeichenfolge in URL. Wenn ich die Zeichenfolge fest codiere, funktioniert alles andere einwandfrei. Mit meinem NSString stimmt also etwas nicht, und wenn ich es nicht herausfinden kann, sollte das eine andere Frage sein. Wenn diese Zeile eingefügt ist (ich habe den Pfad aus dem obigen Konsolenprotokoll eingefügt), funktioniert dies einwandfrei:
photoURL = @"file://localhost/Users/gary/Library/Application%20Support/iPhone%20Simulator/3.2/Media/DCIM/100APPLE/IMG_0004.JPG";
quelle
Antworten:
Sie können dies folgendermaßen tun (synchron, aber kompakt):
Ein viel besserer Ansatz ist die Verwendung von LazyTableImages von Apple, um die Interaktivität zu erhalten.
quelle
Sie können SDWebImage ausprobieren , es bietet:
Kurzes Beispiel:
quelle
UIImageView
.SDWebImage
Sie können auch eineUIImage
direkt mit füllenSDWebImageManager
- (void) downloadWithURL:...
. Siehe ihr Beispiel auf der Read me.Und die schnelle Version:
quelle
Wenn Sie wirklich , absolut positiv sicher , dass die NSURL eine Datei - URL, also
[url isFileURL]
ist garantiert return true in Ihrem Fall, dann können Sie einfach verwenden:quelle
Holen Sie sich DLImageLoader und versuchen Sie, Code zu folgen
Ein weiteres typisches Beispiel aus der Praxis für die Verwendung von DLImageLoader, das jemandem helfen kann ...
Wie ich oben erwähne, ist Haneke eine weitere großartige Bibliothek, die man heutzutage in Betracht ziehen sollte (leider ist sie nicht so leicht).
quelle
Versuchen Sie diesen Code, Sie können das Laden von Bildern damit festlegen, damit die Benutzer wissen, dass Ihre App ein Bild von der URL lädt:
quelle
Schauen Sie sich das hier zur
AsyncImageView
Verfügung gestellte an . Ein guter Beispielcode, der möglicherweise sogar "out of the box" für Sie verwendet werden kann.quelle
AFNetworking ermöglicht das Laden von asynchronen Bildern in eine UIImageView mit Platzhalterunterstützung. Es unterstützt auch asynchrone Netzwerke für die Arbeit mit APIs im Allgemeinen.
quelle
Stellen Sie sicher, dass diese Einstellungen unter iOS 9 aktiviert sind:
App Transport-Sicherheitseinstellungen in Info.plist , um sicherzustellen , dass das Bild von der URL geladen wird , damit das Bild heruntergeladen und festgelegt werden kann.
Und schreibe diesen Code:
quelle
Der Weg mit einer Swift- Erweiterung zu
UIImageView
(Quellcode hier ):Berechnete Eigenschaft für Associated erstellen
UIActivityIndicatorView
Benutzerdefinierter Initializer und Setter
quelle
Der beste und einfachste Weg, um ein Bild über die URL zu laden, ist dieser Code:
Ersetzen
imgUrl
durch IhreImageURL
Ersetzen
imgView
durch IhreUIImageView
.Das Image wird in einen anderen Thread geladen, sodass das Laden der App nicht verlangsamt wird.
quelle