Я думаю, что на самом деле это просто деталь реализации, так что вам как сделать это. Я предполагаю, что они делают все в -drawRect , однако, вы можете реализовать его со слоями Core Animation, если хотите.
Если вы уже рисуете график с помощью -drawRect , то имеет смысл придерживаться этого, однако, если вы просто хотите наложить слои для желтой точки и вертикальной желтой линии, можно просто использовать обычные CALayer s и изменить их положение в ответ на -touchesMoved .
// Create a line layer with a 1px width and yellow bg
CALayer *lineLayer = [CALayer layer];
[lineLayer setBounds:CGRectMake(0.0f, 0.0f, 1.0f, parentViewHeight)];
[lineLayer setPosition:CGPointMake(currentX, parentViewHeight/2.0f)];
[lineLayer setBackgroundColor:[[UIColor yellowColor] CGColor]];
[[parentView layer] addSublayer:lineLayer];
// Create a dot layer with the contents set to a CGImageRef
UIImage *dotImage = [UIImage imageNamed:@"yellowdot.png"];
CALayer *dotLayer = [CALayer layer];
[dotLayer setBounds:CGRectMake(0.0f, 0.0f, [dotImage size].width,
[dotImage size].height)];
[dotLayer setPosition:[lineLayer position]];
[dotLayer setContents:[dotImage CGImage]];
[[parentView layer] addSublayer:dotLayer];
Вам нужно будет сделать эти слои иварами своего класса, чтобы при получении событий касания вы могли обновлять их позиции.
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
{
CGPoint current = [[touches anyObject] locationInView:parentView];
[lineLayer setPosition:CGPointMake(current.x, [lineLayer position].y)];
[dotLayer setPosition:CGPointMake(current.x, [self yForStockPriceAtPoint:current])];
[super touchesMoved:touches withEvent:event];
}