Очистить остатки drawRect () в пользовательском UIControl - PullRequest
0 голосов
/ 27 марта 2012

Я создаю собственный слайдер с использованием подкласса 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 голосов
/ 03 апреля 2012

Нет идей ??Я пытаюсь с

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

Я не вижу, где я делаю ошибку.Но когда я заполняю свой фон непрозрачным цветом (черный цвет), весь фон перерисовывается.

...