Я создаю собственный граф внутри UIView в методе drawRect, используя основную графику.Проблема, с которой я сталкиваюсь, заключается в перемещении этого графика, когда пользователь перетаскивает палец.Например, если мой график имеет 500 точек, а экран имеет ширину всего 320 пикселей, я могу отобразить только подмножество этих точек, а остальные можно получить, нажав и перетащив их, чтобы увидеть остальную часть графика ![See this image](https://i.stack.imgur.com/rx2Xj.png)
Проблема, с которой я сталкиваюсь, перемещается, делает перетаскивание графика довольно изменчивым и не таким быстрым и отзывчивым, как хотелось бы.Я открыт для других предложений, кроме использования 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);
}