Mam adres URL obrazu (otrzymałem go z UIImagePickerController), ale nie mam już obrazu w pamięci (adres URL został zapisany z poprzedniego uruchomienia aplikacji). Czy mogę ponownie załadować UIImage z adresu URL?
Widzę, że UIImage ma imageWithContentsOfFile: ale mam adres URL. Czy mogę użyć dataWithContentsOfURL: NSData do odczytania adresu URL?
EDYCJA1
na podstawie odpowiedzi @ Daniela Wypróbowałem następujący kod, ale nie działa ...
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];
}
Kiedy go uruchomiłem, konsola pokazuje:
-[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'
Patrząc na stos wywołań, wywołuję URLWithString, który wywołuje URLWithString: relativeToURL:, a następnie initWithString: relativeToURL:, następnie _CFStringIsLegalURLString, następnie CFStringGetLength, następnie forwarding_prep_0 , a następnie forwarding , a następnie - [NSObject doesSotRognize].
Jakieś pomysły, dlaczego mój NSString (adres photoURL to 0x536fbe0) nie odpowiada długości? Dlaczego jest napisane, że nie odpowiada - [długość NSURL]? Czy nie wie, że parametr to NSString, a nie NSURL?
EDYCJA2
OK, jedynym problemem z kodem jest konwersja ciągu na adres URL. Jeśli zakoduję ciąg na stałe, wszystko inne działa dobrze. Więc coś jest nie tak z moim NSString i jeśli nie mogę tego rozgryźć, myślę, że to powinno być inne pytanie. Po wstawieniu tej linii (wkleiłem ścieżkę z dziennika konsoli powyżej), działa dobrze:
photoURL = @"file://localhost/Users/gary/Library/Application%20Support/iPhone%20Simulator/3.2/Media/DCIM/100APPLE/IMG_0004.JPG";
źródło
Odpowiedzi:
Możesz to zrobić w ten sposób (synchronicznie, ale kompaktowo):
Znacznie lepszym podejściem jest użycie LazyTableImages firmy Apple w celu zachowania interaktywności.
źródło
Możesz wypróbować SDWebImage , zapewnia:
Szybki przykład:
źródło
UIImageView
.SDWebImage
umożliwia takżeUIImage
bezpośrednie wypełnienie pliku za pomocąSDWebImageManager
- (void) downloadWithURL:...
. Zobacz ich przykład na read me.I szybka wersja:
źródło
Jeśli jesteś naprawdę , absolutnie pozytywnie , czy bibliotece NSURL to adres URL pliku, czyli
[url isFileURL]
gwarantuje powrót prawdziwe w Twoim przypadku, to możesz po prostu użyć:źródło
pobierz DLImageLoader i spróbuj postępować zgodnie z kodem
Kolejny typowy przykład użycia DLImageLoader w prawdziwym świecie, który może komuś pomóc ...
Jak wspomniałem powyżej, kolejną wielką biblioteką do rozważenia w dzisiejszych czasach jest Haneke (niestety nie jest tak lekka).
źródło
Wypróbuj ten kod, możesz ustawić za jego pomocą ładowanie obrazu, aby użytkownicy wiedzieli, że Twoja aplikacja ładuje obraz z adresu URL:
źródło
Sprawdź
AsyncImageView
podane tutaj . Dobry przykładowy kod, który może być nawet użyteczny dla Ciebie „po wyjęciu z pudełka”.źródło
AFNetworking zapewnia asynchroniczne ładowanie obrazu do UIImageView z obsługą symboli zastępczych. Obsługuje również sieci asynchroniczne do pracy z interfejsami API w ogóle.
źródło
Upewnij się, że włącz te ustawienia w iOS 9:
Ustawienia zabezpieczeń transportu aplikacji w Info.plist, aby zapewnić ładowanie obrazu z adresu URL, aby umożliwić pobranie obrazu i ustawienie go.
I napisz ten kod:
źródło
Sposób korzystania z rozszerzenia Swift do
UIImageView
(kod źródłowy tutaj ):Tworzenie obliczonej właściwości dla skojarzonych
UIActivityIndicatorView
Niestandardowy inicjator i ustawiający
źródło
Najlepszym i najłatwiejszym sposobem załadowania obrazu przez adres URL jest ten kod:
Zamień
imgUrl
na swójImageURL
Zastąp
imgView
swoimUIImageView
.Załaduje obraz w innym wątku, więc nie spowolni ładowania aplikacji.
źródło