2010-06-27 6 views
14

J'ai besoin de capturer un UIView et tous ses sous-vues dans un UIImage. Le problème est qu'une partie de la vue est hors écran, donc je ne peux pas utiliser la fonction de capture d'écran, et quand j'essaie d'utiliser la fonction UIGraphicsGetImageFromCurrentImageContext(), elle ne semble pas capturer les sous-vues. Devrait-il capturer les sous-vues et je fais juste quelque chose de mal? Sinon, y a-t-il un autre moyen d'accomplir cela?Besoin de capturer UIView dans un UIImage, y compris toutes les sous-vues

+0

Je suppose que puisque chaque 'UIView' est appel basé sur des couches' - [CALayer drawInContext: viewContext] 'pourrait aider. –

Répondre

2

Voulez-vous dire

UIGraphicsBeginImageContext(view.bounds.size); 
[view.layer drawInContext:UIGraphicsGetCurrentContext()]; 
UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

ne fonctionne pas? Je suis sûr qu'il doit ...

27

C'est la bonne façon de procéder:

+ (UIImage *) imageWithView:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return img; 
} 

Cette méthode est une méthode d'extension pour la classe UIImage, et il prendra également soin de faire les regards d'image bon sur tous les futurs appareils haute résolution.

+2

Vraiment fonctionne !!! – AlexeyVMP

+0

J'ai sauvé mon temps :) Merci –

0

est ici une version 2.x Swift qui devrait fonctionner si vous créez un tableau des UIViews pour s'aplati:

// Flattens <allViews> into single UIImage 
func flattenViews(allViews: [UIView]) -> UIImage? { 
    // Return nil if <allViews> empty 
    if (allViews.isEmpty) { 
     return nil 
    } 

    // If here, compose image out of views in <allViews> 
    // Create graphics context 
    UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, UIScreen.mainScreen().scale) 
    let context = UIGraphicsGetCurrentContext() 
    CGContextSetInterpolationQuality(context, CGInterpolationQuality.High) 

    // Draw each view into context 
    for curView in allViews { 
     curView.drawViewHierarchyInRect(curView.frame, afterScreenUpdates: false) 
    } 

    // Extract image & end context 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    // Return image 
    return image 
} 
Questions connexes