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.


Loading ...