// Jeśli czytasz to i patrzysz na komentarze poniżej i myślisz ?? WTF ?? to dlatego, że edytuję swoją oryginalną odpowiedź, zamiast zamieszczać dwie odpowiedzi w nadziei, że wszystko będzie czystsze. Ważne jest, aby wiedzieć, że ALAssetsLibrary jest rzeczą iOS 4.x.
Poniższy kod posłuży do pobrania adresu URL biblioteki zasobów, a następnie spowoduje usunięcie symbolu UII z reprezentacji miniatur. Chociaż korzystam bezpośrednio z adresu URL biblioteki zasobów, nie ma powodu, aby ten sam kod nie mógł rozpocząć się od przekształcenia reprezentacji łańcuchowej w NSURL w celu spełnienia zadania imageURL
. Zastrzeżenie: ten kod prawdopodobnie jest nieszczelny lub coś gorszego, ale odpowiada na pytanie oryginalnego plakatu i ma nadzieję, że ma on wartość.
Poniższy kod pożycza na t his Stack Overflow question, który obejmuje zasadniczo ten sam temat. Oprócz kodu w tym miejscu włączyłem AssetsLibrary.framework i AlassetsLibrary typedefs wymienione w drugim pytaniu.
Cała sztuczka polega na tym, że nie można bezpośrednio odwoływać się do NSURL z biblioteki zasobów. Myślę (choć nie wiem), że w jakiś sposób odwołuje się do magazynu danych zamiast do pliku, więc dane zwrócone z adresu URL nie są prostymi NSData, więc nie możesz używać go w starym stylu.
Istnieje UIImageView w kodzie o nazwie photo
. Mam nadzieję, że wszystko inne jest łatwe do wymyślenia.
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL];
NSLog(@"%@",imageURL);
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
CGImageRef iref = [myasset thumbnail];
if (iref) {
UIImage *theThumbnail = [UIImage imageWithCGImage:iref];
[[self photo] setImage:theThumbnail];
}
};
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
NSLog(@"booya, cant get image - %@",[myerror localizedDescription]);
};
if(imageURL)
{
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
[assetslibrary assetForURL:imageURL
resultBlock:resultblock
failureBlock:failureblock];
}
[self dismissModalViewControllerAnimated:YES];
}
Jeśli nie chcesz miniaturę ale chce zrobić pełną zdjęcie, po prostu zmienić kod w bloku AssetForURLResult do czegoś takiego:
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
Możemy opuścić to exercize dla użytkownik.
Powodzenia, mam nadzieję, że pomoże ci to wyjaśnić.
Jeśli użytkownik usunie obraz z rolki aparatu, nie będzie to stanowić problemu, obrazek w moim widoku pozostanie pusty. Obraz nie jest konieczny dla reszty widoku. – viperacr99
Obraz nie jest konieczny dla reszty widoku. Wybieram system IOS 4.0 i nowsze. Aby było to łatwiejsze, załóżmy, że chcę umieścić obraz w pełnym rozmiarze w UIImageView. Jak mogę to zrobić, jeśli mam tylko obiekt NSURL ze słownika informacji? Rzeczy, które próbowałem do tej pory, nie zadziałały, przypuszczam, że brakuje mi czegoś oczywistego. – viperacr99
Obiekt NSURL wskazywałby obraz, a następnie można go pobrać. Ponieważ kierujesz reklamy na system IOS 4.0, możesz przejść do samej Biblioteki zasobów. Na blogu iCode znajduje się samouczek (http://icodeblog.com/2010/07/08/asset-libraries-and-blocks-in-ios-4/), ale może już go widziałeś? Kiedy już dysponujesz zasobem, możesz użyć metody valueForPropery i pobrać ALAssetPropertyURL, który jest słownikiem zawierającym adresy URL plików. – Walter