2010-10-27 39 views
4

Je voudrais prendre un UITextView et permettre à l'utilisateur d'y entrer du texte, puis déclencher une copie du contenu dans un contexte bitmap à quartz. Est-ce que quelqu'un sait comment je peux effectuer cette action de copie? Dois-je remplacer la méthode drawRect et appeler [super drawRect] et puis prendre le contexte résultant et le copier? Si oui, quelqu'un a-t-il une référence à un exemple de code à copier d'un contexte à un autre?Copie du contenu dessiné d'un UIView dans un autre

Mise à jour: à la lecture du lien dans la réponse ci-dessous, j'ai rassemblé autant de choses pour tenter de copier mon contenu UIView dans un contexte bitmap, mais quelque chose ne va pas. Je reçois mon contenu en miroir sur l'axe X (c'est-à-dire à l'envers). J'ai essayé d'utiliser CGContextScaleCTM() mais cela semble n'avoir aucun effet. J'ai vérifié que l'UIImage créé à partir des quatre premières lignes crée correctement un UIImage qui n'est pas étrangement pivoté/retourné, donc il y a quelque chose que je fais mal avec les appels suivants.

// copy contents to bitmap context 
    UIGraphicsBeginImageContext(mTextView.bounds.size); 
    [mTextView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage* image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext();  

    [self setNeedsDisplay]; 

    // render the created image to the bitmap context 
    CGImageRef cgImage = [image CGImage]; 

    CGContextScaleCTM(mContext, 1.0, -1.0); // doesn't seem to change result 

    CGContextDrawImage(mContext, CGRectMake(
     mTextView.frame.origin.x, 
     mTextView.frame.origin.y, 
     [image size].width, [image size].height), cgImage); 

Une suggestion?

Répondre

1

Voici le code que je l'habitude d'obtenir un UIImage de UIView:

@implementation UIView (Sreenshot) 

    - (UIImage *)screenshot{ 
     UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [UIScreen mainScreen].scale); 

     /* iOS 7 */ 
     BOOL visible = !self.hidden && self.superview; 
     CGFloat alpha = self.alpha; 
     BOOL animating = self.layer.animationKeys != nil; 
     BOOL success = YES; 
     if ([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]){ 
      //only works when visible 
      if (!animating && alpha == 1 && visible) { 
       success = [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO]; 
      }else{ 
       self.alpha = 1; 
       success = [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES]; 
       self.alpha = alpha; 
      } 
     } 
     if(!success){ /* iOS 6 */ 
      self.alpha = 1; 
      [self.layer renderInContext:UIGraphicsGetCurrentContext()]; 
      self.alpha = alpha; 
     } 

     UIImage* img = UIGraphicsGetImageFromCurrentImageContext(); 

     UIGraphicsEndImageContext(); 

     return img; 
    } 

@end 
0

Vous pouvez utiliser dans iOS 7 et versions ultérieures:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates