2010-05-09 4 views
1

iphone 응용 프로그램의 게이지 디스플레이 프로그래밍 : 고정 된 배경 UIImageView에 대한 중심 바늘 UIImageView. 저는 iPhone 프로그래밍에 익숙하지 않고 CoreAnimation에 대해 많이 모릅니다. 예를 통해 예제를 살펴보고 InterfaceBuilder의 백그라운드에 대한 바늘 이미지의 위치와 위치를보고 내 바늘이 원하는 회전 지점을 찾고 있습니다. 제대로 배경을 중심으로 :애니메이션 UIImageView의 초기 방향을 설정하는 방법은 무엇입니까?

self.needleIV.layer.anchorPoint = CGPointMake(0.5, 0.68); 

내 테스트 애니메이션이 코드를 사용하여 완벽하게 (바늘이 제대로 게이지를 중심으로, 내 원하는 회전 점, 기준점을 중심으로 회전 상태로 유지) 일 :

CABasicAnimation *rotateAnimation = [CABasicAnimation animation]; 
rotateAnimation.keyPath = @"transform.rotation.z"; 
rotateAnimation.fromValue = [NSNumber numberWithFloat:DegreesToRadians((rand() % 270 - 135))]; 
rotateAnimation.toValue = [NSNumber numberWithFloat:DegreesToRadians((rand() % 270 - 135))]; 
rotateAnimation.duration = 4.0; 
rotateAnimation.removedOnCompletion = NO; 
// leaves presentation layer in final state; preventing snap-back to original state 
rotateAnimation.fillMode = kCAFillModeBoth; 
rotateAnimation.repeatCount = 0; 
rotateAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 

// Add the animation to the selection layer. This causes it to begin animating. 
[self.needleIV.layer addAnimation:rotateAnimation forKey:@"rotateAnimation"]; 

문제는 응용 프로그램 시작시 바늘이 먼저 나오고 (이미지 파일에서 바늘이 어떻게 보이는지)를 똑바로 가리키며, 애니메이션 코드를 엉망으로 만들지 않는 초기 회전 값을주는 방법을 알아낼 수 없습니다. ("엉망"은 바늘이 올바른 축에서 회전하지 않고 게이지에서 중심에 있지 않음을 의미합니다).

z 축을 중심으로 회전 된 3 차원 회전 행렬에 layer.transform을 설정하려고했지만 중심에서 바늘을 움직입니다. 나뿐만 아니라이 코드를 시도했다 :

[self.needleIV.layer setValue:[NSNumber numberWithFloat:DegreesToRadians(-135.0)] forKeyPath:@"transform.rotation.z"]; 

중 하나가 작동하지 않았다 (바늘 anchorPoint 센터에서 이동), 분명히 동일한 작업 애니메이션 코드 변환을 사용하고 있기 때문에 나는 큰 기대를 걸고 있었다.

나는 또한보기 컨트롤러의 viewDidLoad 함수에 작업 애니메이션 스 니펫을 넣어서 시작 위치로 바늘을 "움직이게"하려고했지만 아무 것도하지 않습니다. 애니메이션이 끝날 때까지 실행되지 않습니다. 이미지가 실제로 화면에 나타나고 디버거에서 화면이 여전히 viewDidLoad에서 검정색임을 확인했습니다.

이 시점에서 나는 바늘을 올바르게 회전시키는 애니메이션을 설정하기 시작한 후 "충분히 오래"초기 애니메이션을 실행하기 위해 타이머를 해킹하려고 시도하지만 실제로 무엇이 문제인지 이해하고 싶습니다. 여기에서 잘못 될 것입니다. 왜 애니메이션이 회전 전/프리 애니메이션에서의 다른 시도보다 다른 축을 중심으로 회전하고있는 것입니까?

답변

1

anchorPoint는 부모의 경계를 기준으로합니다. viewDidLoad 이후에 부모 레이어/뷰의 경계가 변경 될 수 있습니까?

여러분은 UIView 중심과 변형 속성을 사용하여이 모든 작업을 수행 할 수 있습니다.이 속성은 2D이므로 z 축을 중심으로 암시 적으로 회전합니다.

+0

아니요, 부모님은 변경되지 않으므로 나는 그게 아니라고 생각합니다. 다시 말하지만, CABasicAnimation은 내가 지정한 앵커 포인트를 중심으로 완벽하게 회전합니다 (뷰 상대 좌표 0-1 좌표가 아니라 부모 좌표계가 문서에서 알 수 있음). 위에서 언급 한 모든 "문제"회전이 anchorPoint를 무시하는 것처럼 보입니다. 지금 당장의 해결책은 이미지를 해킹하여 투명한 수직 공간을 추가하여 원하는 회전 점을 이미지의 중심으로 이동시킨 다음 모든 것이 작동한다는 것입니다. . "layer.anchorPoint"* CoreAnimation 루틴에만 사용됩니까? – Bogatyr

+0

뷰에는 중심이 있고 레이어에는 anchorPoint가 있습니다. 회전 및 변환은 교환 가능하지 않으므로 주 변환 값은 변환과 독립적입니다. – drawnonward

+0

그럼 아마도 내 질문에 다른 방식으로 프레임을 만들어야했습니다. "2 차원 UIImageView를 수퍼 뷰 내부의 임의의 위치에 배치하고 내부 점을 중심으로 초기 회전을 부여한 다음 동일한 회전을 애니메이션에 추가하는 적절한 방법은 무엇입니까? 점, superview 내부의 위치에 관계없이 회전이 동일하게 발생합니다. " – Bogatyr

관련 문제