iOS UIBezier Анимация кривых, как создать какую-то дугу? - PullRequest
7 голосов
/ 19 августа 2011

Я почти уверен, что это довольно простой и понятный вопрос для любого, кто когда-либо пробовал это раньше, но я новичок в том, что вы бы назвали "продвинутой" анимацией.

Iя пытаюсь создать следующее движение объекта с помощью CAKeyframeAnimation (с путем ключа позиции)

http://www.sumopaint.com/files/images800/aeegfexznpohlehd.jpg

Я пытался установить путь с UIBezierPath, но запуталсяи разочарован довольно быстро, не находя логики, стоящей за этим :)

Я бы хотел услышать, если у вас есть мнение по этому поводу ...

Это мой базовый код (который можетХорошо бы написать с нуля, если возникнет лучшая идея: P)

Также я хотел бы затенить объект по завершении.Есть ли такой селектор, который выполняет по завершении анимации?(например, [UIView animateWithDuration])?

UIBezierPath *thumbPath = [UIBezierPath bezierPath];
[thumbPath moveToPoint: P(99,270)];
[thumbPath addCurveToPoint:P(164,260) controlPoint1:P(164,280) controlPoint2:P(164,280)];
[thumbPath addCurveToPoint:P(164,260) controlPoint1:P(260,310) controlPoint2:P(260,310)];

CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.path = thumbPath.CGPath;
pathAnimation.duration = 2.0;

Ответы [ 2 ]

6 голосов
/ 20 августа 2011

Просто хотел бы поделиться самым простым способом, который я нашел для этого, для любого, кто является новичком в CAAnimation, такого как я.

Вместо использования UIBezierPath, я просто вручную написал точки на экране (x, y) для пути, а затем создал путь, используя их, создавая необходимую кривую. Очень полезно и просто.

Надеюсь, вы найдете это полезным:

NSArray *myPoints = [NSArray arrayWithObjects: 
                             [NSValue valueWithCGPoint:P(77,287)],
                             [NSValue valueWithCGPoint:P(97,270)],
                             [NSValue valueWithCGPoint:P(112,260)],
                             [NSValue valueWithCGPoint:P(130,250)],
                             [NSValue valueWithCGPoint:P(154,245)],
                             [NSValue valueWithCGPoint:P(174,250)],
                             [NSValue valueWithCGPoint:P(193,260)],
                             [NSValue valueWithCGPoint:P(210,270)],
                             [NSValue valueWithCGPoint:P(231,287)],
                             nil];

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 77, 280);

for(NSValue *val in myPoints){
    CGPoint p = [val CGPointValue];
    CGPathAddLineToPoint(path, NULL, p.x, p.y);
}

CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.path = path;
CGPathRelease(path);
0 голосов
/ 15 декабря 2011

Реализация методов касания, добавление начальной точки в метод begin

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:myImageView];
    StartDrawPoint = point;
}

Теперь вызовите метод рисования в TouchMoved

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [touches anyObject];
    CGPoint currentTouchPoint = [touch locationInView:myImageView];
    [self drawline:currentTouchPoint ToPoint:StartDrawPoint];
}

Метод Draw

- (void)drawline:(CGPoint)FromPoint ToPoint:(CGPoint)ToPoint{
   UIGraphicsBeginImageContext(myImageView.frame.size);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0,1.0,1.0, 1.0);
    [imgView.image drawInRect:CGRectMake(0, 0, myImageView.frame.size.width, myImageView.frame.size.height)];
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:FromPoint];
    [path addLineToPoint:ToPoint];
    [path setLineWidth:5.0f];
    [path stroke];
    [path closePath];
    myImageView.image = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();
}
...