UIView绘制rect保留前一个绘图,并且不在view.transform上清除

时间:2014-08-18 09:40:37

标签: ios objective-c drawrect cgaffinetransform

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

My Custom 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;
}

2 个答案:

答案 0 :(得分:10)

确定已设置此设置(但默认为YES)。

self.clearsContextBeforeDrawing = YES;

来自UIView

中的Apple的文档
  

当   设置为YES,绘图缓冲区自动清除为透明   调用drawRect:方法之前的黑色。此行为可确保   视图的内容时没有遗留任何视觉文物   被重新绘制。如果视图的opaque属性也设置为YES,则   视图的backgroundColor属性不能为nil或绘制错误   可能导致。此属性的默认值为YES。

     

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

答案 1 :(得分:5)

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

来自DBD的答案(取自文档):

  

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

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