2016-09-06 1 views
1

나는 원형 라인을 표시 EFCircularSlider를 사용하고 사용자는 다음과 같이 핸들러를 이동합니다 : 내가 애니메이션 동작에 빨간 선 표시를 제외한 모든 사용자의 요구 사항을 완료 한CGContext가 루프에서 그리지 않는 이유는 무엇입니까?

enter image description here

. 나는 내 코드를 많이 바꿀 수 없다. 나는이 원호 선을 점차적으로 그리려하고있다. 애니메이션을 사용하는 대신 CGContext를 사용하고 루프에 원을 표시하는 데 사용하고 있습니다. 그러나 루프의 끝에서 이미지를 그립니다. 나는 그것을 아래로 추적 가지고 만든 확인 루프는 다음과 같이 제대로 불리는지고 :

내가 메소드를 호출하고 있습니다 :

int tmp = self.angleFromNorth; 
    while (tmp<360) { 
     NSLog(@"tmp == %d",tmp); 
     tmp+=10; 
     [NSThread sleepForTimeInterval: 0.1]; 
     [EFCircularTrig drawUnfilledArcInContext:ctx 
              center:self.centerPoint 
              radius:self.radius 
             lineWidth:self.lineWidth 
           fromAngleFromNorth:self.angleFromNorth 
           toAngleFromNorth:tmp]; 
      [self setNeedsDisplay]; 
    } 

을 그리고 그것은 루프가 종료 된 후에 만 ​​제대로 라인을 인쇄 만합니다. 모든 값을 인쇄하면 선이 표시됩니다. 하지만 애니메이션과 비슷하게 만들고 싶습니다.

+(void) drawUnfilledArcInContext:(CGContextRef)ctx 
          center:(CGPoint)center 
          radius:(CGFloat)radius 
         lineWidth:(CGFloat)lineWidth 
       fromAngleFromNorth:(CGFloat)fromAngleFromNorth 
       toAngleFromNorth:(CGFloat)toAngleFromNorth 
{ 

    float cartesianFromAngle = CompassToCartesian(ToRad(fromAngleFromNorth)); 
    float cartesianToAngle = CompassToCartesian(ToRad(toAngleFromNorth)); 

    CGContextAddArc(ctx, 
        center.x, // arc start point x 
        center.y, // arc start point y 
        radius,  // arc radius from center 
        cartesianFromAngle, cartesianToAngle, 
        0); // iOS flips the y coordinate so anti-clockwise (specified here by 0) becomes clockwise (desired)! 

    CGContextSetLineWidth(ctx, lineWidth); 
    CGContextSetLineCap(ctx, kCGLineCapButt); 
    CGContextSetShadowWithColor(ctx, CGSizeMake(0,0), 1, [UIColor colorWithRed:(0/255.0) green:(173/255.0) blue:(238/255.0) alpha:1.0].CGColor); 
    CGContextDrawPath(ctx, kCGPathStroke); 

    NSLog(@"HERE"); 
} 

출력 :

2016-09-06 22:52:48.950 EFCircularSlider[38301:288182] tmp == 22 
2016-09-06 22:52:49.056 EFCircularSlider[38301:288182] HERE 
2016-09-06 22:52:49.056 EFCircularSlider[38301:288182] tmp == 32 
2016-09-06 22:52:49.161 EFCircularSlider[38301:288182] HERE 
2016-09-06 22:52:49.162 EFCircularSlider[38301:288182] tmp == 42 
2016-09-06 22:52:49.265 EFCircularSlider[38301:288182] HERE 
2016-09-06 22:52:49.266 EFCircularSlider[38301:288182] tmp == 52 
2016-09-06 22:52:49.371 EFCircularSlider[38301:288182] HERE 
2016-09-06 22:52:49.372 EFCircularSlider[38301:288182] tmp == 62 
2016-09-06 22:52:49.475 EFCircularSlider[38301:288182] HERE 
2016-09-06 22:52:49.475 EFCircularSlider[38301:288182] tmp == 72 
2016-09-06 22:52:49.580 EFCircularSlider[38301:288182] HERE 

그러나 루프가 완료되면 도면이 표시됩니다. 나는 그것을 서서히 나타나게하고 싶다. 누구든지 여기에 exprience를 추가 할 수 있다면 고맙겠습니다.

은 또한 추가 :

답변

1

을 이벤트 루프의 끝에서 (drawRect 반환 후), 맥락에서 모든 것이 화면으로 구성됩니다. 이벤트 루프가 끝날 때까지는 화면이 아닌 컨텍스트를 수정하는 것입니다. 모든 setNeedsDisplay이 "다음에 이벤트 루프가 실행되면이 뷰를 다시 그려야합니다."라고 말합니다. 실제로 아무 것도 그려 내지 않습니다.

당신의 접근 방식은 작동하지 않습니다. 주 스레드 (또는 일반적으로 모든 스레드)에서 sleepForTimeInterval:을 호출하는 경우 문제가 완전히 해결됩니다. iOS에서이 작업을 너무 오래하면 OS가 앱을 종료합니다.

경로를 움직여야합니다. 일반적으로 CAShapeLayer에 애니메이션을 적용하는 것이 가장 좋습니다 (strokeStartstrokeEnd 속성에 애니메이션을 적용 할 수 있음). 호를 직접 그리는 것이 아니라 경로를 생성하는 것이 좋습니다. 이러한 종류의 애니메이션에는 많은 소개가 있습니다 (예 : Ole Begemann의 Animating the Drawing of a CGPath with CAShapeLayer 참조).

그러나 짧은 버전의 경우 전체 호를 그리려면 UIBezierPath 또는 CGPath의 호출로 그리기 문을 변환 한 다음 CABasicAnimation을 사용하여 애니메이션을 만듭니다.

관련 문제