Janusz Chudzynski
Janusz Chudzynski

Reputation: 2710

How to apply UIScrollView's transform to UIView?

In my app I have a scrollview with an added subview called allView. In the scrollview delegate methods I am applying value of the current transformation of the scrollview's subview to another view called paint view

paintView.transform = allView.transform

and save it to the disk.

The image that is created in result of that process looks different than the one on the screen. Why? How can I fix it?

View Controller

- (void)scrollViewDidScroll:(UIScrollView *)scrollView;                                               {
    self.paintView.transform =self.allView.transform;
    [self.paintView setNeedsDisplay];   
}
  - (void)scrollViewDidZoom:(UIScrollView *)scrollView{
         self.backgroundView.transform = self.allView.transform;
        [self.paintView setNeedsDisplay];
    }

Paint View

Inside the PaintView's draw rect I am trying to apply transformation from the scroll view and

- (void)drawRect:(CGRect)rect
{

// Drawing code
 // Draw on the screen
    CGContextRef ctx1 =UIGraphicsGetCurrentContext();
    CGContextConcatCTM(ctx1, self.transform);

    CGColorRef wh = [[UIColor redColor]CGColor];
    CGContextSetStrokeColorWithColor(ctx1, wh);
    CGContextMoveToPoint(ctx1, 0, 0);
    CGContextAddLineToPoint(ctx1, 200, 200);
    CGContextStrokePath(ctx1);

   // Apply scroll view's transformation
    CGRect  r = CGRectApplyAffineTransform(rect,self.transform );

    //that gives a resized image
    UIGraphicsBeginImageContextWithOptions(r.size, NO, 0.0);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextConcatCTM(ctx, self.transform);
    // stroke and so on          
     CGContextSetStrokeColorWithColor(ctx, wh);
     CGContextMoveToPoint(ctx, 0, 0);
     CGContextAddLineToPoint(ctx, 200, 200);
     CGContextStrokePath(ctx);

    Getting image with entire content.
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    //Clipping the image
    CGImageRef cgImg = CGImageCreateWithImageInRect(image.CGImage, rect);
    UIImage *img = [UIImage imageWithCGImage:cgImg];
    NSData * d = UIImageJPEGRepresentation(img, 0.8);
    //saving the image (for debugging)
    [self save:d];
    UIGraphicsEndImageContext();    
}

iOS Simulator Desired Effect

Image saved to the disk Result

Upvotes: 2

Views: 761

Answers (1)

Christian Di Lorenzo
Christian Di Lorenzo

Reputation: 3612

It may be a little bit hard to diagnose the problem here without being able to have running code. However, I think the problem may be on these lines where you are clipping the image:

// Clipping the image
CGImageRef cgImg = CGImageCreateWithImageInRect(image.CGImage, rect);
UIImage *img = [UIImage imageWithCGImage:cgImg];

I think you actually just want to get the scroll view's visible rect, which would be scrollView.frame rather than the subview that fills the scroll view's entire contentSize. So, using some way (such as a property on paintView such as a visibleFrame), I would revise the lines to be something like this:

// Clipping the image
CGImageRef cgImg = CGImageCreateWithImageInRect(image.CGImage, self.visibleFrame);
UIImage *img = [UIImage imageWithCGImage:cgImg];

Hope this helps you get passed this issue!

Upvotes: 1

Related Questions