清除自定义UIControl中drawRect()的残余

时间:2012-03-26 20:28:48

标签: iphone drawrect

我使用UIControl的子类创建一个自定义滑块,我在drawRect()中绘制我的背景和按钮但是当我重绘我的按钮时,它们是先前绘制的残余,我该如何清除?我尝试使用仪器跟踪内存泄漏,但没有泄漏。我的代码:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGFloat radius = 10;

//    [[UIColor redColor] set];
//    CGContextAddRect(context, rect);
//    CGContextStrokePath(context);

    // Make sure corner radius isn't larger than half the shorter side
    if (radius > self.bounds.size.width/2.0) radius = self.bounds.size.width/2.0;
    if (radius > self.bounds.size.height/2.0) radius = self.bounds.size.height/2.0;

    CGFloat minx = CGRectGetMinX(self.bounds);
    CGFloat midx = CGRectGetMidX(self.bounds);
    CGFloat maxx = CGRectGetMaxX(self.bounds);
    CGFloat miny = CGRectGetMinY(self.bounds);
    CGFloat maxy = CGRectGetMaxY(self.bounds);


//    CGContextMoveToPoint(context, minx, midy);
//    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
//    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
//    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
//    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);

    CGContextMoveToPoint(context, maxx, miny);
    CGContextAddArcToPoint(context, minx, miny+ 30, minx, miny+150, radius);
    CGContextAddArcToPoint(context, minx, maxy-30, minx+30, maxy, radius);
    CGContextAddLineToPoint (context, maxx, maxy);

    CGContextClosePath(context);

    CGContextSetRGBFillColor(context,
                             0.0, 0.0, 0.0, 0.2 );
    CGContextSetRGBStrokeColor( context,
                               0.7, 0.7, 0.7, 0.4 );
    CGContextDrawPath(context, kCGPathFill);

    CGContextSetLineWidth(context, 10);
    CGContextSetLineCap(context, kCGLineCapRound);

    CGContextMoveToPoint(context, midx, miny+ 80);
    CGContextAddLineToPoint(context, midx, maxy-50);
    CGContextStrokePath(context);
//    CGContextDrawPath(context, kCGPathStroke);
    [self drawButton: _buttonRect inContext:context];

}

和drawButton()函数

- (void)drawButton:(CGRect)rect inContext:(CGContextRef) context{
    UIGraphicsPushContext(context);
    CGFloat radius = 7;
    //    [[UIColor redColor] set];
    //    CGContextAddRect(context, rect);
    //    CGContextStrokePath(context);

    //    if (radius > self.bounds.size.width/2.0) radius = self.bounds.size.width/2.0;
    //    if (radius > self.bounds.size.height/2.0) radius = self.bounds.size.height/2.0;

    CGFloat minx = CGRectGetMinX(rect);
    CGFloat midx = CGRectGetMidX(rect);
    CGFloat maxx = CGRectGetMaxX(rect);
    CGFloat miny = CGRectGetMinY(rect);
    CGFloat midy = CGRectGetMidY(rect);
    CGFloat maxy = CGRectGetMaxY(rect);

    CGContextMoveToPoint(context, minx, midy);
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);

    CGContextClosePath(context);
    CGContextSetRGBFillColor(context,
                             1.0, 1.0, 1.0, 1.0 );
    //    CGContextSetRGBStrokeColor(context,
    //                             0.0, 0.0, 0.0, 1.0 );
    CGContextDrawPath(context, kCGPathFill);

    CGContextSetRGBStrokeColor(context,
                               1.0, 0.0, 0.0, 1.0 );




    //Gradient related variables
    size_t locationCount = 3;
    CGFloat locationList[] = {0.0,0.5,1.0};
    CGFloat colorList[] = {
        0.0, 0.0, 0.0, 1.0, 
        0.5, 0.5, 0.5, 1.0,
        1.0, 1.0, 1.0, 1.0
    };
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colorList, 
                                                                 locationList, locationCount);

    //Paint a linear gradient
    CGPoint startPoint, endPoint;
    startPoint.x = midx;
    startPoint.y = midy-2.5;
    endPoint.x = midx;
    endPoint.y = midy+2.5;



    CGContextSaveGState(context);
    CGContextAddEllipseInRect(context, CGRectMake(midx-2.5, midy-2.5, 5, 5));
    CGContextClosePath(context);
    CGContextClip(context);
    CGContextDrawLinearGradient (context, gradient, startPoint, endPoint, kCGGradientDrawsAfterEndLocation);
    CGContextRestoreGState(context);

    UIGraphicsPopContext();
}

我尝试了很多东西,但现在我不知道,谢谢。

1 个答案:

答案 0 :(得分:0)

没有想法?我试试

CGContextClearRect() 
CGContextFillRect() 
setOpaque to No 
setBackgroundColor to clearColor 
call to setNeedsDisplay() 
setClearsContextBeforeDrawing to YES
etc... 

我看不出我在哪里犯了错误。但是当我用不透明的颜色(blackColor)填充背景时,所有背景都会重绘。

相关问题