UIView 绘制矩形保留了上一个绘图,并且在查看时不清除。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;

From Apple's Docs in UIView

当设置为YES,则绘图缓冲区自动清除为透明在drawRect:方法被调用之前显示为黑色。这种行为确保当视图的内容时,没有留下任何视觉工件重绘。如果视图的opaque属性也被设置为YES,则视图的backgroundColor属性不能为nil或绘制错误可能发生。此属性的默认值是YES。

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

你需要将背景色设置为nil以外的颜色

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

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

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

最新更新