Мой вопрос заключается в том, как анимировать процесс рисования при рисовании с помощью CGContextRef
. Является ли это возможным? Если предположить, то как?
У меня есть два фрагмента кода, которые я хотел бы оживить. Первый рисует индикатор выполнения, а второй рисует простую линейную диаграмму. Рисунок выполняется внутри подкласса UIView
.
Прогресс-бар удобен и удобен. Но я хочу, чтобы он как бы вытягивался слева. Я почти уверен, что для этого потребуется использовать что-то другое, кроме UIRectFill
, но я не знаю, как это сделать.
- (void)drawProgressLine
{
[bgColor set];
UIRectFill(self.bounds);
[graphColor set];
UIRectFill(CGRectMake(0, 0, self.frame.size.width / 100 * [[items objectAtIndex:0] floatValue], self.frame.size.height));
}
Линейный график немного сложнее. Мне бы очень хотелось, чтобы он начал рисовать себя слева, строка за строкой, медленно завершая себя вправо, но если это слишком много, как я могу просто постепенно исчезать? Код:
- (void)drawLineChart
{
[bgColor set];
UIRectFill(self.bounds);
[graphColor set];
if (items.count < 2) return;
CGRect bounds = CGRectMake(0, 50, self.bounds.size.width, self.bounds.size.height - 100);
float max = -1;
for (GraphItem *item in items)
if (item.value > max)
max = item.value;
float xStep = (self.frame.size.width) / (items.count - 1);
for (int i = 0; i < items.count; i++)
{
if (i == items.count - 1) break;
float itemHeight = bounds.origin.y + bounds.size.height - ((GraphItem*)[items objectAtIndex:i]).value / max * bounds.size.height;
float nextItemHeight = bounds.origin.y + bounds.size.height - ((GraphItem*)[items objectAtIndex:i + 1]).value / max * bounds.size.height;
CGPoint start = CGPointMake(xStep * i, itemHeight);
CGPoint stop = CGPointMake(xStep * (i + 1), nextItemHeight);
[self drawLineFromPoint:start toPoint:stop lineWidth:1 color:graphColor shadow:YES];
}
}
Довольно просто, я думаю. Если важно, drawLineFromPoint.....
реализовано так:
- (void)drawLineFromPoint:(CGPoint)startPoint toPoint:(CGPoint)endPoint lineWidth:(CGFloat)width color:(UIColor *)color shadow:(BOOL)shadow
{
if (shadow)
{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat components[4] = {0.0, 0.0, 0.0, 1.0};
CGColorRef shadowColor = CGColorCreate(colorSpace, components);
CGContextSetShadowWithColor(UIGraphicsGetCurrentContext(), CGSizeMake(1,1), 2.0, shadowColor);
}
CGContextBeginPath(context);
CGContextSetLineWidth(context, width);
CGContextMoveToPoint(context, startPoint.x, startPoint.y);
CGContextAddLineToPoint(context, endPoint.x, endPoint.y);
CGContextClosePath(context);
[color setStroke];
CGContextStrokePath(context);
CGContextSetShadowWithColor(context, CGSizeZero, 0, NULL);
}
Надеюсь, я ясно выразился, потому что в моей стране сейчас час ночи, и этот пост — последнее, что стоит между мной и моей кроватью. Привет, Ян.