I have the following code to display a marker in a UIView. The marker shows up well, and as soon as we try to scale up and scale the UIView with a transform, the first drawing will remain as it is, even after calling setNeedsDisplay.
My custom subclass of UIView has the following code
- (void)drawRect:(CGRect)rect { // Drawing code CGFloat w=20.0f; CGFloat h=8.0f; CGContextRef context=UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor); CGContextClearRect(context,self.bounds); CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); CGContextSetLineCap(context, 2.0); CGMutablePathRef leftMarker=CGPathCreateMutable(); CGPathMoveToPoint(leftMarker, NULL, 0, 0); CGPathAddLineToPoint(leftMarker, NULL, w, 0); CGPathAddLineToPoint(leftMarker,NULL, w, h); CGPathAddLineToPoint(leftMarker,NULL, h, h); CGPathAddLineToPoint(leftMarker,NULL,h, w); CGPathAddLineToPoint(leftMarker,NULL,0, w); CGPathAddLineToPoint(leftMarker,NULL, 0, 0); CGContextAddPath(context, leftMarker); CGContextDrawPath(context, kCGPathFill); const CGAffineTransform rightMarkerTransform=CGAffineTransformMakeRotateTranslate(DEGREES_TO_RADIANS(90),self.frame.size.width,0); CGPathRef rightMarker=CGPathCreateCopyByTransformingPath(path, &rightMarkerTransform); CGContextAddPath(context, rightMarker); CGContextDrawPath(context, kCGPathFill); const CGAffineTransform leftMarkerBottomTransform=CGAffineTransformMakeRotateTranslate(DEGREES_TO_RADIANS(270),0,self.frame.size.height); CGPathRef leftMarkerbottom=CGPathCreateCopyByTransformingPath(path, &leftMarkerBottomTransform); CGContextAddPath(context, leftMarkerbottom); CGContextDrawPath(context, kCGPathFill); const CGAffineTransform rightMarkerBottomTransform=CGAffineTransformMakeRotateTranslate(DEGREES_TO_RADIANS(180),self.frame.size.width,self.frame.size.height); CGPathRef rightMarkerBottom=CGPathCreateCopyByTransformingPath(path, &rightMarkerBottomTransform); CGContextAddPath(context, rightMarkerBottom); CGContextDrawPath(context, kCGPathFill); CGPathRelease(rightMarker); CGPathRelease(leftMarkerbottom); CGPathRelease(rightMarkerBottom); CGPathRelease(leftMarker); }
Below is the zoom code when clicked
CGFloat lastScale; -(void) handlepinchGesture:(UIPinchGestureRecognizer*)gesture{ UIView *gestureV=gesture.view; CGFloat scale=gesture.scale; switch (gesture.state) { case UIGestureRecognizerStateBegan: if(lastScale<1.0){ lastScale=1.0; } scale=lastScale; break; default: break; } if(scale<1.0){ scale=1.0; } lastScale=scale; gestureV.transform=CGAffineTransformMakeScale(scale, scale);