Копирование нарисованного содержимого одного UIView в другой - PullRequest
4 голосов
/ 27 октября 2010

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

Обновление: после прочтения ссылки в ответе ниже, я собрал это много, чтобы попытаться скопировать свое содержимое 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); 

Есть предложения?

Ответы [ 2 ]

1 голос
/ 09 апреля 2015

Вот код, который я использовал для получения 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 голосов
/ 15 апреля 2016

Вы можете использовать в iOS 7 и более поздних версиях:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates 
...