2015-01-21 2 views
0

코어 파운데이션 CGPathAddArc()를 사용하여 호 (a.k.a. 반원)를 만드는 코드가 있습니다. 코드가 64 비트 OS 장치 (iPad Air 및 Air 2, iPhone 5s, iPhone 6 등)에서 실행될 때 호가 그려지지 않는 경우도 있지만 32 비트 장치에서 그립니다. _drawArcClockwise가 TRUE 인 경우 아크 무, 그 예에서64 비트 iOS 디바이스에서 내 호가 그리지 않는 이유는 무엇입니까?

CGPathAddArc(path, 
      nil, 
      CGRectGetMidX(bounds), 
      CGRectGetMidY(bounds), 
      MIN(bounds.size.width/2, bounds.size.height/2), 
      3*M_PI_2, 
      -M_PI_2, 
      _drawArcClockwise 
      ); 

하지만 _drawArcClockwiseFALSE 경우 아무 것도 그리지 않습니다

코드는 다음과 같이 보입니다.

또한 동일한 UIBezierPath 함수를 테스트했으며 동일한 결과를 제공합니다.

당신은 ArcTest (링크)라는 REPO

답변

4

대답은 아이폰 OS의 64 비트 구현에 버그가있는 것 같다에서 GitHub의에서이 문제를 보여주는 예제 프로젝트를 볼 수 있습니다. (또는 아마도 버그는 32 비트 구현에 있습니다.) 올바른 동작이 무엇인지에 관계없이 32 비트 및 64 비트 장치는 동일한 매개 변수를 사용하여 동일한 호출에 응답하여 다르게 동작합니다.

CGFloat startAngle, endAngle; 
startAngle = _drawArcClockwise ? 3*M_PI_2 : -M_PI_2; 
endAngle = _drawArcClockwise ? -M_PI_2 : 3*M_PI_2; 
CGPathAddArc(path, 
      nil, 
      CGRectGetMidX(bounds), 
      CGRectGetMidY(bounds), 
      MIN(bounds.size.width/2, bounds.size.height/2), 
      startAngle, 
      endAngle, 
      _drawArcClockwise 
      ); 

그 코드는 32 개 비트 및 64 비트 플랫폼에서 작동 :

상기 코드에 대한 수정 시계 == FALSE가 될 때 및 endAngle startAngle로부터 파라미터를 교환한다. 아크가 두 플랫폼 모두에서 그려지는 방향을 보지 않았습니까? 일반적으로 모양 레이어의 호를 사용하여 애니메이션을 만들고 모양 레이어의 strokeStart 및/또는 strokeEnd 속성을 조작하는 경우 중요합니다.

관련 문제