2010-10-27 3 views
4

Я хотел бы взять UITextView и разрешить пользователю вводить текст в него, а затем запускать копию содержимого в контексте растрового кварца. Кто-нибудь знает, как я могу выполнить это действие копии? Должен ли я переопределить метод drawRect и вызвать [super drawRect] и , тогда взять полученный контекст и скопировать его? Если да, то кто-нибудь имеет ссылку на образец кода для копирования из одного контекста в другой?Копирование рисованного содержимого одного UIView другому

Обновление: прочитав ссылку в ответе ниже, я собрал это, чтобы попытаться скопировать содержимое UIView в растровый контекст, но что-то по-прежнему не так. Я получаю содержимое, отраженное по оси X (т. Е. С ног на голову). Я попытался использовать CGContextScaleCTM(), но это, кажется, не имеет никакого эффекта.

Я проверил, что созданный UIImage из первых четырех строк правильно создает UIImage, который не странно повернут/перевернут, так что я кое-что не так с последними вызовами.

// 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); 

Любые предложения?

ответ

1

Вот код, который я использовал, чтобы получить UIImage от 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

Вы можете использовать в прошивке 7 и новее:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates