UIView绘制矩形保留的以前的绘图,并不清除view.transform

我有以下代码显示在UIView中的标记。 标记显示很好,一旦我们尝试使用变换捏缩放和缩放UIView,即使在调用setNeedsDisplay之后,第一个绘图仍然保持原样。

我的自定义UIView子类有以下代码

- (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); } 

缩放缩放代码如下所示

 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); //Even this does not work ….[gestureV setNeedsDisplay]; gesture.scale=scale; } 

让你确定有这个设置(但是应该默认为YES)。

self.clearsContextBeforeDrawing = YES;

UIView Apple文档

设置为YES时,在调用drawRect:方法之前,绘图缓冲区会自动清除为透明黑色。 此行为可确保在重新绘制视图内容时不会留下任何视觉工件。 如果视图的不透明属性也设置为YES,则视图的backgroundColor属性不能为零,否则可能会出现绘图错误。 该属性的默认值是YES。

如果将此属性的值设置为NO,则您有责任确保在drawRect:方法中正确绘制视图的内容。 如果您的绘图代码已经大量优化,设置此属性为NO可以提高性能,尤其是在滚动时,只需要重绘一部分视图。

您需要将背景颜色设置为nil以外的其他颜色。

从DBD的回答(从文档中获得):

如果视图的不透明属性也设置为YES,则视图的backgroundColor属性不能为零,否则可能会出现绘图错误。

您还需要确保self.clearsContextBeforeDrawing设置为YES