Frequently Asked Question
Add image and scale it with finger (maintaining proportions)
Last Updated a year ago
This article shows how to add an image and scale it with finger (maintaining proportions).
In PDFView class, add the following methods:
- (BOOL)vImageStart{ if( ![m_doc canSave] ) return false; if( m_status == sta_none ) { self.scrollEnabled = false; m_status = sta_image; return true; } return false;} -(void)vImageCancel{ if( m_status == sta_image ) { self.scrollEnabled = true; m_status = sta_none; [self refresh]; } } -(void)vImageEnd{ if( m_status == sta_image ) { m_modified = true; m_status = sta_none; [self refresh]; self.scrollEnabled = true; } } -(bool)OnImageTouchBegin:(CGPoint)point{ if( m_status != sta_image ) return false; imgAnnot = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon57.png"]]; imgAnnot.center = CGPointMake(self.contentOffset.x + point.x - (imgAnnot.frame.size.width / 2), self.contentOffset.y + point.y - (imgAnnot.frame.size.height / 2)); [self addSubview:imgAnnot]; return true; } -(bool)OnImageTouchMove:(CGPoint)point{ if( m_status != sta_image ) return false; CGRect origin = imgAnnot.frame; float deltaMoveX = self.contentOffset.x + point.x - origin.origin.x - origin.size.width; float deltaMoveY = self.contentOffset.y + point.y - origin.origin.y - origin.size.height; float prop = imgAnnot.frame.size.width / imgAnnot.frame.size.height; if (self.contentOffset.x + point.x > origin.origin.x && self.contentOffset.y + point.y > origin.origin.y) { float width = (deltaMoveX > deltaMoveY) ? self.contentOffset.x + point.x - origin.origin.x : (self.contentOffset.y + point.y - origin.origin.y) * prop; float height = (deltaMoveX < deltaMoveY) ? self.contentOffset.y + point.y - origin.origin.y : (self.contentOffset.x + point.x - origin.origin.x) / prop; [imgAnnot setFrame:CGRectMake(origin.origin.x, origin.origin.y, width, height)]; } return true; } -(bool)OnImageTouchEnd:(CGPoint)point{ if( m_status != sta_image ) return false; struct PDFV_POS pos1; struct PDFV_POS pos2; m_view vGetPos:&pos1 :(imgAnnot.frame.origin.x - self.contentOffset.x) * m_scale :(imgAnnot.frame.origin.y - self.contentOffset.y) * m_scale]; [m_view vGetPos:&pos2 :(imgAnnot.frame.origin.x - self.contentOffset.x + imgAnnot.frame.size.width) * m_scale :(imgAnnot.frame.origin.y - self.contentOffset.y + imgAnnot.frame.size.height) * m_scale]; PDF_RECT rect; rect.left = pos1.x; rect.right = pos2.x; rect.top = pos1.y; rect.bottom = pos2.y; [self vAddImageWithImage:imgAnnot.image withRect:rect]; [imgAnnot removeFromSuperview]; return true; } - (void)vAddImageWithImage:(UIImage *)image withRect:(PDF_RECT)rect{ // Create the cache file NSString *tp = NSTemporaryDirectory(); tp = [tp stringByAppendingPathComponent:@"cache.dat"]; [m_doc setCache:tp]; // Create the PDFPage instance of the current page PDFPage *page = [m_doc page:m_cur_page]; // Create the CGImageRef of the image CGImageRef ref = [image CGImage]; // Add the image [page addAnnotBitmap:ref :YES :&rect]; // Re-render the current page [m_view vRenderSync:m_cur_page]; [self refresh]; // Save the PDF file [m_doc save]; }
Now you should update touchesBegan, touchesMoved, touchesEnded method and add OnImageTouchBegin:point, OnImageTouchMoved:point and OnImageTouchEnded:point method, in this way:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ ... ... ... if( [self OnNoteTouchBegin:point] ) return; if( [self OnInkTouchBegin:point] ) return; if( [self OnRectTouchBegin:point] ) return; if( [self OnEllipseTouchBegin:point] ) return; if ([self OnImageTouchBegin:point]) return; [self OnNoneTouchBegin:point:touch.timestamp]; } } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ ... ... ... if( [self OnNoteTouchMove:point] ) return; if( [self OnInkTouchMove:point] ) return; if( [self OnRectTouchMove:point] ) return; if( [self OnEllipseTouchMove:point] ) return; if( [self OnImageTouchMove:point] ) return; [self OnNoneTouchMove:point:touch.timestamp]; } } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ ... ... ... if( [self OnNoteTouchEnd:point] ) return; if( [self OnInkTouchEnd:point] ) return; if( [self OnRectTouchEnd:point] ) return; if( [self OnEllipseTouchEnd:point] ) return; if( [self OnImageTouchEnd:point] ) return; [self OnNoneTouchEnd:point:touch.timestamp]; } } }
Now you can call [m_view vImageStart] and [m_view vImageEnd] to toggle the image insert mode.
In this example we used a static image "icon57.png", but you could edit that method and use a custom image.