2014-01-28 2 views
1

"drawRect"메서드에서 Paintcode (위대한 응용 프로그램, btw)로 만든 베 지어 곡선에 애니메이션을 적용하고 사용자 정의 UIView에서 그리기하고 있습니다.베지에 곡선 점 애니메이션하기

그림이 잘 작동하지만 베 지어 곡선에서 단일 점에 애니메이션을 적용하려고합니다.

가 여기 내 비 작동 방법입니다 :

-(void)animateFlame{ 
    NSLog(@"Animating"); 
    // Create the starting path. Your curved line. 
    //UIBezierPath * startPath; 
    // Create the end path. Your straight line. 
    //UIBezierPath * endPath = [self generateFlame]; 
    //[endPath moveToPoint: CGPointMake(167.47, 214)]; 

    int displacementX = (((int)arc4random()%50))-25; 
    int displacementY = (((int)arc4random()%30))-15; 
    NSLog(@"%i %i",displacementX,displacementY); 

    UIBezierPath* theBezierPath = [UIBezierPath bezierPath]; 
    [theBezierPath moveToPoint: CGPointMake(167.47, 214)]; 
    [theBezierPath addCurveToPoint: CGPointMake(181+displacementX, 100+displacementY) controlPoint1: CGPointMake(89.74, 214) controlPoint2: CGPointMake(192.78+displacementX, 76.52+displacementY)]; 
    [theBezierPath addCurveToPoint: CGPointMake(167.47, 214) controlPoint1: CGPointMake(169.22+displacementX, 123.48+displacementY) controlPoint2: CGPointMake(245.2, 214)]; 
    [theBezierPath closePath]; 
    // Create the shape layer to display and animate the line. 
    CAShapeLayer * myLineShapeLayer = [[CAShapeLayer alloc] init]; 

    CABasicAnimation * pathAnimation = [CABasicAnimation animationWithKeyPath:@"path"]; 
    pathAnimation.fromValue = (__bridge id)[bezierPath CGPath]; 
    pathAnimation.toValue = (__bridge id)[theBezierPath CGPath]; 
    pathAnimation.duration = 0.39f; 
    [myLineShapeLayer addAnimation:pathAnimation forKey:@"pathAnimation"]; 

    bezierPath = theBezierPath; 
} 

이 사용, 아무것도 모든 화면에 이동합니다. 생성 된 무작위 변위는 양호하며 bezierPath 변수는 클래스 범위로 선언 된 UIBezierPath입니다.

나는 뭔가를 놓친가요? (목표는 일종의 캔들 같은 애니메이션을하는 것입니다)

답변

3

빠른 편집 방금 ​​본 레이어 코드. 몇 가지 다른 개념을 혼합하고 있습니다. drawRect, CAShapeLayer, 이전 애니메이션 코드 등 ...

아래의 방법을 사용하면이 작업을 수행 할 수 있습니다.

이 작업을 수행 할 수 없습니다 :(당신이 (당신이 애니메이션의 과정을 통해 여러 번 그릴 얻을 수없는 즉,)의 drawRect의 내용을 애니메이션 할 수 없습니다.

당신은 할 수 있습니다 타이머 또는 무언가를 사용하고 자신의 애니메이션 유형 코드를 만듭니다. 즉 초당 30 번 발생하는 타이머를 만들고 애니메이션에있는 위치를 계산하고 변경하려는 값을 업데이트하는 함수를 실행하고 [self setNeedsDisplay];을 호출하여 RECT 방법을 그립니다. 그 외에는

을 많이 할 수는 없다.

다른 편집

여기에 다른 옵션을 추가하기 만하면됩니다. CAShapeLayer를 사용하면 성능이 매우 저하 될 수 있습니다. 일련의 UIImages가있는 UIImageView를 사용하는 것이 가장 좋습니다.

UIImageView에는 속성, animationImages, animationDuration 등이 내장되어 있습니다.

가능한 해결책

CAShapeLayerpath 속성은 애니메이션이며, 그래서 당신은 가능한 사용이 있었다.

뭔가처럼 ... 그런

// set up properties for path 
@property (nonatomic, assign) CGPath startPath; 
@property (nonatomic, assign) CGPath endPath; 
@property (nonatomic, strong) CAShapeLayer *pathLayer; 

// create the startPath 
UIBezierPath *path = [UIBezierPath //create your path using the paint code code 
self.startPath = path.CGPath; 

// create the end path 
path = [UIBezierPath //create your path using the paint code code 
self.endPath = path.CGPath; 

// create the shapee layer 
self.pathLayer = [CAShapeLayer layer]; 
self.pathLayer.path = self.startPath; 
//also set line width, colour, shadows, etc... 

[self.view.layer addSubLayer:self.pathLayer]; 

이 같은 경로를 애니메이션 할 수 있어야한다 ...

- (void)animatePath 
{ 
    [UIView animateWithDuration:2.0 
     animations^() { 
      self.pathlayer.path = self.endPath; 
    }]; 
} 

는 CAShapeLayer와 애니메이션에 대한 문서에서 노트가 많이 있습니다 경로 속성

그래도 작동합니다.

또한 이전 애니메이션 코드를 제거하십시오. iOS4.3부터 업데이트 된 블록 애니메이션을 사용해야합니다.

+1

고마워요! 나는 그것을 얻을 수 없었고 애니메이션 블록과 CAShapeLayer를 사용하여 당신의 방법을 사용했다. (아무 일도 일어나지 않았고 여러 가지를 시도했다.) 내 마지막 해결책은 타이머를 사용하고 setNeedsDisplay를 호출하는 것이다. 나만의 애니메이션 관리. –

+0

끝내서 다행 이네요. – Fogmeister