2011-05-15 65 views
0

我試圖從iPad的觸摸屏上將指紋簽名打印到PDF,然後將生成的PDF通過電子郵件發送到預設地址。我寫了一個UIView子類,它在當前拖動事件的位置和最後一個拖動事件的位置之間添加了一些行,如下所示。我沒有實施電子郵件部分的麻煩。子類的聲明:在iOS中將子視圖圖像打印到PDF

#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。據我瞭解上面的代碼,它應該保留一個簽名的副本,作爲名爲cachedSignature的UIImage的最後一步,所有人都可以訪問。但是,當我嘗試使用以下內容將其寫入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'表明它具有零協議條目和零方法條目;所以我懷疑它沒有被正確訪問 - 除此之外,我很無知,不知道如何繼續。

回答

0

首先,當您嘗試繪製它時,您的cachedSignature可能不再存在,因爲它是自動釋放的。當你分配它時使用屬性設置器,所以不要使用cachedSignature = foo來編寫self.cachedSignature = foo

另外,UIGraphicsGetImageFromCurrentImageContext僅適用於圖像上下文,不能在當前上下文中使用drawRect:。方法drawRect:負責將視圖繪製到屏幕上,但不能從相同的上下文創建圖像,因此必須使用UIGraphicsBeginImageContext來創建將圖像繪製到的新上下文。無論如何,drawRect:方法並不是最好的地方,因爲如果每次觸摸移動時渲染圖像,性能可能會很差。相反,我建議將簽名呈現給touchesEnded:withEvent:實施中的圖像。