2016-08-29 6 views
0

Я создал CAShapeLayer и добавил кубическую дорожку Безье (с функцией addCurveToPoint:controlPoint1:controlPoint2:) и добавил небольшой взгляд на начальную точку этой кривой. После этого я создал CAKeyFrameAnimation и переместил этот маленький вид из начальной точки кривой в конечную точку с анимацией. Я хочу получить центральную точку этого вида во время анимации. Есть идеи?Как получить координаты просмотра во время анимации?

CGPoint start, p, p1,p2; 
start = CGPointMake(0, 150); 
p = CGPointMake(300, 150); 
p1 = CGPointMake(50, 225); 
p2 = CGPointMake(250, 75); 
[self.bezierPath moveToPoint:start]; 
[self.bezierPath addCurveToPoint:p 
        controlPoint1:p1 
        controlPoint2:p2]; 

NSLog(@"self bezierpath = %@",self.bezierPath); 
CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
shapeLayer.path = self.bezierPath.CGPath; 
shapeLayer.fillColor = [UIColor clearColor].CGColor; 
shapeLayer.strokeColor = [UIColor redColor].CGColor; 
shapeLayer.lineWidth = 3.f; 
[self.yellowView.layer addSublayer:shapeLayer]; 

self.sliderThumb = [[UIView alloc]initWithFrame:(CGRect){0,0,20,20}]; 
self.sliderThumb.backgroundColor = [UIColor blackColor]; 
self.sliderThumb.center = CGPointMake(0, 150); 
[self.yellowView addSubview:self.sliderThumb]; 
CAKeyframeAnimation *animation = [CAKeyframeAnimation animation]; 
animation.keyPath = @"position"; 
animation.duration = 4.f; 
animation.path = self.bezierPath.CGPath; 
[self.sliderThumb.layer addAnimation:animation forKey:nil]; 
CALayer *layer = self.sliderThumb.layer.presentationLayer; 
NSLog(@"layer coordinates %f", layer.frame.origin.x); 

`

ответ

0

presentationLayer из слоя зрения является CALayer, который захватывает, где слой в середине анимации.

Например, если вы хотите получить обновления кадр за кадром, настроить CADisplayLink и изучить presentationLayer в обработчике на ссылку экранного:

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
animation.duration = 4.0f; 
animation.path = self.bezierPath.CGPath; 
animation.delegate = self;         // so we know when animation finished 
[self startDisplayLink];         // start display link 
[self.sliderThumb.layer addAnimation:animation forKey:nil]; 

С:

@property (nonatomic, weak) CADisplayLink *displayLink; 

И:

// Called when animation stops (assuming you set the `delegate` for the animation). 

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag { 
    [self stopDisplayLink:self.displayLink]; 
} 

/// Start the display link. 

- (void)startDisplayLink { 
    CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)]; 
    [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 
    self.displayLink = displayLink; 
} 

/// Stop the display link. 
/// 
/// @parameter displayLink The display link to be stopped. 

- (void)stopDisplayLink:(CADisplayLink *)displayLink { 
    [displayLink invalidate]; 
} 

/// The display link handler. 
/// 
/// Called once for each frame of the animation. 
/// 
/// @parameter displayLink The display link being handled. 

- (void)handleDisplayLink:(CADisplayLink *)displayLink { 
    CALayer *layer = self.sliderThumb.layer.presentationLayer; 
    NSLog(@"layer coordinates %f", layer.frame.origin.x); 
} 
+0

благодарит за ответ. Знаете ли вы, есть ли другой способ получить координаты этой кривой? Я хочу создать что-то вроде слайдера, но с искривленным треком. – passingnil

+0

См. Http://stackoverflow.com/a/13667092/1271826. – Rob

+0

Отлично! Спасибо. @Rob – passingnil