MFMailComposeViewController: Anfügen von Bildern aus der Fotogalerie
Bin ich mit ein bisschen Mühe anfügen von Bildern aus der Foto-Galerie an eine E-Mail.
Grundsätzlich eine der Funktionen von mein-Anwendung ermöglicht es dem Benutzer, Fotos zu machen. Wenn Sie die snap shot, nehme ich den URL-Verweis auf das Bild in Core Data. Ich verstehe, dass Sie haben zu durch zu gehen die ALAssetRepresentation
zum Bild. Ich habe diese und läuft innerhalb meiner Anwendung, wenn der Nutzer will, um zu überprüfen, ein Bild, das Sie genommen haben.
Ich bin nun versucht, dem Benutzer zu ermöglichen, fügen Sie alle von den Fotos, die für ein Ereignis an eine E-Mail. Während dies zu tun, die ich Durchlaufen und die Core-Data-Entität, speichert die URL-Verweise, eine Methode aufzurufen, gibt eine UIImage
von der ALAssetsLibrary
und dann legt Sie mit der NSData
/UIImageJPEGRepresentation
und MFMailComposeViewController
/addAttachmentData
Methoden.
Problem ist: Wenn die E-Mail wird dem Benutzer präsentiert, es sind kleine Blaue Quadrate repräsentieren die Bilder und das Bild ist nicht angebracht.
Hier ist der code:
- (void)sendReportReport
{
if ([MFMailComposeViewController canSendMail])
{
MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];
mailer.mailComposeDelegate = self;
[mailer setSubject:@"Log: Report"];
NSArray *toRecipients = [NSArray arrayWithObjects:@"[email protected]", nil];
[mailer setToRecipients:toRecipients];
NSError *error;
NSFetchRequest *fetchPhotos = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Photo" inManagedObjectContext:__managedObjectContext];
[fetchPhotos setEntity:entity];
NSArray *fetchedPhotos = [__managedObjectContext executeFetchRequest:fetchPhotos error:&error];
int counter;
for (NSManagedObject *managedObject in fetchedPhotos ) {
Photo *photo = (Photo *)managedObject;
// UIImage *myImage = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png", counter++]];
NSData *imageData = UIImageJPEGRepresentation([self getImage:photo.referenceURL], 0.5);
// NSData *imageData = UIImagePNGRepresentation([self getImage:photo.referenceURL]);
// [mailer addAttachmentData:imageData mimeType:@"image/jpeg" fileName:[NSString stringWithFormat:@"%i", counter]];
[mailer addAttachmentData:imageData mimeType:@"image/jpeg" fileName:[NSString stringWithFormat:@"a.jpg"]];
counter++;
}
NSString *emailBody = [self getEmailBody];
[mailer setMessageBody:emailBody isHTML:NO];
[self presentModalViewController:mailer animated:YES];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Failure"
message:@"Your device doesn't support the composer sheet"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
}
und die Methode liefert den UIImage
:
#pragma mark - Get Photo from Asset Library
+ (ALAssetsLibrary *)defaultAssetsLibrary {
static dispatch_once_t pred = 0;
static ALAssetsLibrary *library = nil;
dispatch_once(&pred, ^{
library = [[ALAssetsLibrary alloc] init];
});
return library;
}
- (UIImage *)getImage:(NSString *)URLReference
{
__block UIImage *xPhoto = nil;
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
UIImage *xImage;
//get the image
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullScreenImage];
if (iref) {
xImage = [UIImage imageWithCGImage:iref];
}
xPhoto = xImage;
};
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
NSLog(@"Error fetching photo: %@",[myerror localizedDescription]);
};
NSURL *asseturl = [NSURL URLWithString:URLReference];
//create library and set callbacks
ALAssetsLibrary *al = [DetailsViewController defaultAssetsLibrary];
[al assetForURL:asseturl
resultBlock:resultblock
failureBlock:failureblock];
return xPhoto;
}
HINWEIS: Diese oben genannten code ausgeführt wird, es tut sich einfach nicht an das Bild. Bitte beachten Sie auch, ich bin in der Lage, erfolgreich befestigen Sie Bilder aus der Galerie innerhalb meiner Anwendung, solange ich Sie in einen UIImageView
.Bild bereits (im Grunde, ich fahre mit dem Zeiger auf das Bild von der UIImageView
und der übergabe an die addAttachmentData
Methode.) Es ist nur, wenn ich Versuch zu Durchlaufen zentralen Daten und Anhängen, ohne Sie zunächst das Bild in ein UIImageView
dass ich den ärger.
Irgendwelche Tipps würde sehr geschätzt werden!
Dank!
Jason
- Haben Sie gedruckt, der Inhalt des Bildes, bevor Sie es als Anhang? (
CFShow([self getImage:photo.referenceURL]);
) Vielleicht ist es nil an dieser Stelle? - Hi Jaydee, meine Vermutung ist, dass Sie korrekt sind. Es ist wahrscheinlich gleich null. Aber, was soll ich tun? Bin ich an dieses in die falsche Richtung, aber die Schaffung einer Methode zurückgibt, die ein UIImage? Sollte ich etwas anders machen zu Durchlaufen, meine Liste von URL-Referenzen zu Foto-Galerie-Bilder?
- gehen Sie einfach um den Fehler zu finden. Wenn das Bild null ist, werden als Ihre Referenz-URL ist offensichtlich falsch. So überprüfen Sie, wie die URL erstellt wird..
- Die Referenz-URL ist NICHT falsch. Wie ich bereits in meinem ursprünglichen Beitrag, ich bin in der Lage, erfolgreich Rendern das Bild von der Referenz-URL in einer anderen Ansicht innerhalb meiner Anwendung. Wie Sie erraten das Bild ist null, aber ich bin nicht zu verstehen, warum. Ich denke, es hat etwas zu tun mit der Rückkehr der UIImage über die Rückgabe der Methode. Wenn Sie sind kenntnisreich über ALAssetsLibraryAssetForURLResultblock ich würde schätzen, wenn Sie möchten, schauen Sie auf die Funktion " getImage-Methode, und lassen Sie mich wissen, wenn Sie sehen, was dazu führen würde, dass das Bild zurückgegeben werden, wie nil. Ich habe das Bild mit cfshow, aber es ist nicht zurückgekehrt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oh jetzt sehe ich es.. sry. Sie sind mit einem asynchronen block um das Bild aus der asset-Bibliothek. Aber direkt nach dem Start, dass die operation, sind Sie wieder
xImage
. Aber der asynchrone Vorgang wird später beenden. Damit sind Sie wieder gleich null.Sie brauchen, um Ihre architectur zu smth like this:
In Ihr .h-Datei, die Sie brauchen zwei neue Mitglieder:
In Ihr .m-Datei zu tun smth so:
Ändern Ihre Funktion " getImage-Methode loadImage:
Erstellen Sie eine neue callback-Methode:
Und eine zusätzliche Methode für die schließlich dem senden der mail nach dem abrufen der Bilder:
[NSMutableArray alloc] init]
und natürlich befreien Sie in Ihremdealloc
.