Печать изображения подпредставления в PDF в iOS - PullRequest
0 голосов
/ 15 мая 2011

Я пытаюсь взять подпись с отпечатком пальца на сенсорном экране iPad, распечатать ее в PDF, а затем отправить полученный PDF по электронной почте на заданный адрес.У меня есть подкласс UIView, который добавляет строки между местоположением текущего события перетаскивания в местоположение последнего события перетаскивания, как показано ниже.У меня не было проблем с реализацией части электронной почты.Объявление подкласса:

#import <UIKit/UIKit.h>

@interface SignatureView : UIView {
    UIImageView *drawImage;
    @public
    UIImage *cachedSignature;
}
@property (nonatomic, retain) UIImage* cachedSignature;
-(void) clearView;

@end

И реализация:

#import "SignatureView.h"

@implementation SignatureView

Boolean drawSignature=FALSE;
float oldTouchX=-1;
float oldTouchY=-1;
float nowTouchX=-1;
float nowTouchY=-1;
@synthesize cachedSignature;
//UIImage *cachedSignature=nil;

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code.
    }
    return self;
    if (cachedSignature==nil){
        if(UIGraphicsBeginImageContextWithOptions!=NULL){
            UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);
        }else{
            UIGraphicsBeginImageContext(self.frame.size);
        }
        [self.layer renderInContext:UIGraphicsGetCurrentContext()];
        cachedSignature = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
}

- (void)drawRect:(CGRect)rect {
    //get image of current state of signature field
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    cachedSignature = UIGraphicsGetImageFromCurrentImageContext();

    //draw cached signature onto signature field, no matter what.

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, CGRectMake(0,0,302,90),cachedSignature.CGImage);

    if(oldTouchX>0 && oldTouchY>0 && nowTouchX>0 && nowTouchY>0){
        CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
        CGContextSetLineWidth(context, 2);
                //make change to signature field
        CGContextMoveToPoint(context, oldTouchX, oldTouchY);

        CGContextAddLineToPoint(context, nowTouchX, nowTouchY);
        CGContextStrokePath(context);
    }
 }
-(void) clearView{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetGrayFillColor(context, 0.75, 1.0);
    CGContextFillRect(context, CGRectMake(0,0,800,600));
    CGContextFlush(context);
    cachedSignature = UIGraphicsGetImageFromCurrentImageContext();
    [self setNeedsDisplay];
}

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint location=[[touches anyObject] locationInView:self];
    oldTouchX=nowTouchX;
    oldTouchY=nowTouchY;
    nowTouchX=location.x;
    nowTouchY=location.y;
    [self setNeedsDisplay];
}
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint location=[[touches anyObject] locationInView:self];
    oldTouchX=nowTouchX;
    oldTouchY=nowTouchY;
    nowTouchX=location.x;
    nowTouchY=location.y;
    [self setNeedsDisplay];
}

 -(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
     oldTouchX=-1;
     oldTouchY=-1;
     nowTouchX=-1;
     nowTouchY=-1;
 }

- (void)dealloc {
    [super dealloc];
}


@end

Однако у меня возникают проблемы при печати подписи в PDF.Как я понимаю в приведенном выше коде, он должен сохранять копию подписи до того, как последний ход был сделан как UIImage с именем cachedSignature, доступный для всех.Однако, когда я пытаюсь записать его в контекст PDF со следующим:

    UIGraphicsBeginPDFContextToFile(fileName, CGRectZero, nil);
    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil);
    UIImage* background=[[UIImage alloc] initWithContentsOfFile:backgroundPath];
    // Create the PDF context using the default page size of 612 x 792.
    // Mark the beginning of a new page.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, 0.0, 792);
    CGContextScaleCTM(context, 1.0, -1.0);
    //CGContextDrawImage(context, CGRectMake(0,0,612,790),background.CGImage);
    //draw signature images
    UIImage *y=clientSignatureView.cachedSignature;
    CGContextDrawImage(context, CGRectMake(450, 653, 600, 75), y.CGImage);
    //CGContextDrawImage(context, CGRectMake(75, 75, 300, 300),     techSignatureView.cachedSignature.CGImage);
    CGContextTranslateCTM(context, 0.0, 792);
    CGContextScaleCTM(context, 1.0, -1.0);

Не удается.В этом случае «techSignatureView» и «clientSignatureView» являются экземплярами пользовательского UIView, как определено выше, подключенного к выходам в том же родительском UIView, в котором выполняется этот код.Я убрал вызов, чтобы напечатать фоновое изображение, на случай, если оно было напечатано «позади», безрезультатно.Использование отладчика для проверки 'y' в приведенном выше коде показывает, что он имеет записи протокола nil и записи метода nil;поэтому я подозреваю, что к нему не обращаются должным образом - кроме того, я не знаю, как действовать.

1 Ответ

0 голосов
/ 15 мая 2011

Прежде всего, ваша cachedSignature, вероятно, больше не существует, когда вы пытаетесь ее нарисовать, потому что она автоматически выпущена.При назначении его используйте установщик свойств, поэтому вместо cachedSignature = foo write self.cachedSignature = foo.

Кроме того, UIGraphicsGetImageFromCurrentImageContext работает только для контекстов изображения, его нельзя использовать в drawRect: с текущим контекстом.Метод drawRect: обеспечивает отображение вашего вида на экране, вы не можете создать изображение из того же контекста, вы должны использовать UIGraphicsBeginImageContext, чтобы создать новый контекст, в который вы рисуете изображение.В любом случае, метод drawRect: - не лучшее место для этого, потому что производительность, скорее всего, будет плохой, если вы будете рендерить изображение при каждом касании.Вместо этого я бы предложил визуализировать подпись к изображению в вашей реализации touchesEnded:withEvent:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...