Пользовательский график с базовой графикой и изменчивой частотой кадров при вызове touchesMoved - PullRequest
1 голос
/ 24 ноября 2011

Я создаю собственный граф внутри UIView в методе drawRect, используя основную графику.Проблема, с которой я сталкиваюсь, заключается в перемещении этого графика, когда пользователь перетаскивает палец.Например, если мой график имеет 500 точек, а экран имеет ширину всего 320 пикселей, я могу отобразить только подмножество этих точек, а остальные можно получить, нажав и перетащив их, чтобы увидеть остальную часть графика See this image

Проблема, с которой я сталкиваюсь, перемещается, делает перетаскивание графика довольно изменчивым и не таким быстрым и отзывчивым, как хотелось бы.Я открыт для других предложений, кроме использования CoreGraphics, но это казалось лучшим выбором.Пожалуйста, смотрите мой метод drawRect ниже и спасибо заранее!

- (void)drawRect:(CGRect)rect {
//[self initGraph];

// grab the current view graphics context
// the context is basically our invisible canvas that we draw into.
CGContextRef context    = UIGraphicsGetCurrentContext();
CGContextClearRect( context , [self bounds] );

CGMutablePathRef path = CGPathCreateMutable();
int spread = 1;
spread = (int)ceil((double)self.bounds.size.width/(double)[graphPoints count]);
int xTrace = 0;
int firstX = 0;
int firstY = 0; 
int count=0;
for(NSDecimalNumber *aPoint in graphPoints){
    int yPos = [self priceToPoint:aPoint];
    if(yPos < 0){
        yPos = 1;
    }
    if(count==0){
        firstX = xTrace;
        firstY = yPos;
        CGPathMoveToPoint(path, NULL, (xTrace+xOffset)+lastOffset, yPos);
    }else{
        CGPathAddLineToPoint(path, NULL, (xTrace+xOffset)+lastOffset, yPos);
    }
    xTrace = xTrace+spread;
    count++;
}
xTrace = xTrace-spread;
CGPathAddLineToPoint(path, NULL, (xTrace+xOffset)+lastOffset, self.bounds.size.height);
CGPathAddLineToPoint(path, NULL, 0, self.bounds.size.height);
CGPathAddLineToPoint(path, NULL, firstX,firstY);
// setup the gradient
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat components[8] = {
    0.0/255.0, 94.0/255.0, 143.0/255.0, 1.0,  // Start color
    61.0/255.0, 110.0/255.0, 135.0/255.0, 1.0   // End color
};
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradientFill = CGGradientCreateWithColorComponents (colorSpace, components, locations, 2);

// setup gradient points
CGRect pathRect = CGPathGetBoundingBox(path);
CGPoint myStartPoint, myEndPoint;
myStartPoint.x = CGRectGetMinX(pathRect);
myStartPoint.y = CGRectGetMinY(pathRect);
myEndPoint.x = CGRectGetMaxX(pathRect);
myEndPoint.y = CGRectGetMinY(pathRect);

// draw the gradient
CGContextAddPath(context, path);
CGContextSaveGState(context);
CGContextClip(context);
CGContextDrawLinearGradient (context, gradientFill, myStartPoint, myEndPoint, 0);
CGContextRestoreGState(context);

// draw the dash
CGContextAddPath(context, path);
CGContextSetLineWidth(context, 2.0);
CGContextSetRGBStrokeColor(context,87.0/255.0,155.0/255.0,191.0/255.0,0.8);
CGContextStrokePath(context);

// cleanup
CGColorSpaceRelease(colorSpace);
CGGradientRelease(gradientFill);
CGPathRelease(path);

}

...