2009-03-28 6 views
2

Je développe une application iPhone pour créer des images en utilisant des graphiques intégrés et du texte défini par l'utilisateur. Je veux être en mesure d'avoir mon application, avec des graphiques intégrés et du texte défini par l'utilisateur, qui peuvent ensuite être envoyés en une seule image (un peu comme une capture d'écran) à l'application de courrier électronique à envoyer.Emailing plein écran de l'application iPhone

Existe-t-il un moyen de le faire sans prendre de capture d'écran, en quittant l'application, en accédant à l'application Photos, en sélectionnant la capture d'écran et en l'envoyant par courrier électronique?

En fin de compte je voudrais pouvoir avoir un bouton dans mon application que l'utilisateur pourrait taper, et l'écran entier serait capturé et envoyé directement à l'application de courrier.

Tous les pointeurs acceptés avec reconnaissance!

Répondre

0

Je ne sais pas si cela va fonctionner, mais vous pouvez essayer de créer un contexte graphique bitmap, puis obtenir la couche d'animation de base de votre vue racine et en appelant sa méthode -renderInContext:. Que pourrait le faire, mais je ne l'ai jamais essayé. Peut-être, cependant, vous devriez envisager une approche différente. Est-ce que c'est juste que vous avez écrit un tas de code de dessin personnalisé qui est visible à l'écran et que vous voulez être capable de dessiner dans un fichier ou un tampon de mémoire aussi? Si c'est le cas, vous devriez peut-être factoriser ce code de dessin hors de votre vue et dans un objet distinct que votre vue utilise simplement. Cela vous permettrait de dessiner très facilement dans les deux sens.

5

Pour élargir la réponse de Brent, le code suivant va récupérer une capture d'écran et l'enregistrer sur le répertoire des documents comme screenshot.png appelé PNG:

UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow]; 

UIGraphicsBeginImageContext(screenWindow.frame.size); 
[screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

NSData *screenshotPNG = UIImagePNGRepresentation(screenshot); 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSError *error = nil; 
[screenshotPNG writeToFile:[documentsDirectory stringByAppendingPathComponent:@"screenshot.png"] options:NSAtomicWrite error:&error]; 

Ceci est un peu brut, comme il laissera un emplacement vide près du haut de l'écran pour la barre de titre et ne semble pas récupérer le contenu de CAEAGLLayers.

En outre, je ne crois pas que vous pouvez utiliser la construction d'URL mailto: // standard, suivie de openURL, pour envoyer des pièces jointes codées au format MIME. Peut-être que le SDK 3.0 corrige cela, mais je n'ai pas encore joué avec. Vous devrez peut-être utiliser quelque chose comme sksmtpmessage pour envoyer le message directement à partir de votre application.

+0

Je parie que si vous avez bouclé à travers le tableau de fenêtres de UIApplication et les rend tous (au lieu de seulement la keyWindow), la barre d'état serait dessinée. – benzado

4

Il existe également l'API privée UIGetScreenImage. Il est utilisé comme ceci:

CGImageRef UIGetScreenImage(); 
@interface UIImage (ScreenImage) 
+ (UIImage *)imageWithScreenContents; 
@end 

@implementation UIImage (ScreenImage) 
+ (UIImage *)imageWithScreenContents 
{ 
    CGImageRef cgScreen = UIGetScreenImage(); 
    if (cgScreen) { 
     UIImage *result = [UIImage imageWithCGImage:cgScreen]; 
     CGImageRelease(cgScreen); 
     return result; 
    } 
    return nil; 
} 
@end 

Cette fonction peut être combinée avec UIImagePNGRepresentation pour produire un PNG.

+0

Je ne sais pas si ça marchait, mais ça ne marche pas maintenant. – Dimitris

+0

Cela fonctionne toujours, mais seulement sur l'appareil (pas dans le simulateur) et Apple le rejettera définitivement. – rpetrich

1

skpsmtpmessage est super. Si fait, c'est tellement bon, je suis allé le cloner et ajouté un exemple de projet sur github. L'exemple d'interface graphique ci-dessous ajoute quelques cloches et des sifflets, comme une barre de progression et quelques autres goodies, mais il maintient essentiellement le code skpsmtpmessage de base.

http://github.com/kailoa/iphone-smtp/tree/master

0

Dans OS 3.0, vous pouvez utiliser MFMailComposeViewController:

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; 
picker.mailComposeDelegate = self; 
[picker addAttachmentData:screenshotPNG mimeType:@"image/png" fileName:@"PNGfromMyApp"]; 
3

Apple est now allowing applications d'utiliser le;

CGImageRef UIGetScreenImage(void); 

fonction.Bien que vous devez vous rappeler qu'il renvoie un CGImageRef conservé et vous devrez gérer votre mémoire en conséquence.

Ils disent aussi que «... une future version de l'iPhone OS peut fournir une API publique équivalent de cette fonctionnalité. À ce moment, toutes les applications utilisant UIGetScreenImage() seront tenus d'adopter l'API publique. "