2010-12-03 3 views
0

실행되는 모든 작업을 추적하지 않고 어떻게 CGAffineTransform 작업을 여러 번 (애니메이션 블록에서) 실행합니까?연속적인 CGAffineTransforms를 추적하여 화면의 특정 지점에 도달하는 방법은 무엇입니까?

변환 작업은 x, y 좌표를 사용하지 않고 대신 시프트 값을 사용합니다. 따라서 "위치 2"에서 현재 번역 된 위치를 알지 못하면 "위치 3"으로 이동하기 위해 이동할 값을 어떻게 알 수 있습니까? 예를 들어

: - 위치 1. 내가가 번역 변환 설정 (768, 0)와 -90도 회전 -

UIView의의 프레임에있다 (0, 0) 위치 2. 일부 시간이 경과하고 이제 (768, 1024)로 이동하고 -90도 (위치 3)를 회전하려고합니다.

위치 2에서 위치 3으로 이동하려면 어떻게 번역해야합니까?

  • 전체 화면
  • 위쪽 가장자리를 차지하고의 상단에있는 UIToolbar을 차지 UIView의 : 맥락에서

    , 나는 다음과 같은 아이 패드보기를 달성하기 위해 노력하고있어 UIView
  • iPad가 회전 할 때 UIView는 장치와 함께 유지되지만 도구 모음은 항상 화면의 위쪽 가장자리에 있도록 회전합니다.

나는 CGAffineTransform을 사용하여 번역 및 회전하여 도구 모음을 이동합니다. iPad를 여러 번 회전하는 경우를 제외하고는 훌륭하게 작동합니다. 첫 번째 translate/rotate는 완벽하게 작동합니다. 다음 값으로 변환 할 올바른 값을 모르기 때문에 변환이 해제됩니다.

업데이트 : 나는 UIView.transform 구조체의 현재 번역 (TX, TY) 값을하고 새 위치의 차이를 사용하는 경우, 작동처럼

것 같습니다. 그러나보기를 회전 한 경우이 작동하지 않습니다. tx 및 ty 값은 이전 로테이션 때문에 뒤집을 수 있습니다. 어떻게 처리해야할지 모르겠습니다.

업데이트 2 :

몇 가지 조사를하는, 나는 텍사스에서 원래의 회전되지 않은 포인트를 얻을 수 있다는 것을 발견했습니다 점의 복근 값을 받고 아마도 경우 x와 y를 교환하여 타이 UIView는 수직입니다. 이제 올바른 순서로 다음 변환 집합을 올바르게 적용하는 방법을 알아 냈습니다. 아무리 내가 그들을 concat, UIView 잘못 된 장소에서 끝나는 것 같다. 이 모든 것이 너무 복잡하고 더 쉬운 방법이 있어야하는 것 같습니다.

답변

0

대답은 분명히 변환을 추적하지 않는다는 것입니다.

그래서 도구 모음을 화면에서 회전하는 방법은 이 아니며은 회전 및 변환 변환을 연결하는 것입니다. 대신 회전 변환을 만들고 애니메이션 블록에서 프레임을 설정하십시오. 또한 새로운 UIInterfaceOrientation을 기반으로 0, -90, -180, -270의 나침반 값을 기준으로 회전 각도를 설정합니다. 또한 동일한 위치에 프레임 크기 기준을 설정하십시오.

그래서 :

CGPoint portrait = CGPointMake(0, 0); 
CGPoint landscapeLeft = CGPointMake(768 - 44, 0); 
CGPoint landscapeRight = CGPointMake(0, 0); 
CGPoint upsideDown = CGPointMake(0, 1024 - 44); 

CGSize portraitSize = CGSizeMake(768, 44); 
CGSize landscapeLeftSize = CGSizeMake(44, 1024); 
CGSize landscapeRightSize = CGSizeMake(44, 1024); 
CGSize upsideDownSize = CGSizeMake(768, 44); 

CGFloat rotation; 
CGRect newLocation; 
switch(orientation) { 
    case UIDeviceOrientationPortrait: 
     NSLog(@"Changing to Portrait"); 
     newLocation.origin = portrait; 
     newLocation.size = portraitSize; 
     rotation = 0.0; 
     break; 

    case UIDeviceOrientationLandscapeRight: 
     NSLog(@"Changing to Landscape Right"); 
     newLocation.origin = landscapeRight; 
     newLocation.size = landscapeRightSize; 
     rotation = -90.0; 
     break; 

    case UIDeviceOrientationLandscapeLeft: 
     NSLog(@"Changing to Landscape Left"); 
     newLocation.origin = landscapeLeft; 
     newLocation.size = landscapeLeftSize; 
     rotation = -270.0; 
     break; 

    case UIDeviceOrientationPortraitUpsideDown: 
     NSLog(@"Changing to Upside Down"); 
     newLocation.origin = upsideDown; 
     newLocation.size = upsideDownSize; 
     rotation = -180.0; 
     break; 

    default: 
     NSLog(@"Unknown orientation: %d", orientation); 
     newLocation.origin = portrait; 
     newLocation.size = portraitSize; 
     rotation = 0.0; 
     break; 
} 

CGRect frame = newLocation; 
CGAffineTransform transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(rotation)); 

if(lastOrientation) { 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:.3]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
} 

toolbar.transform = transform; 
toolbar.frame = frame; 

// Commit the changes 
if(lastOrientation) { 
    [UIView commitAnimations]; 
} 

lastOrientation = orientation; 

이 아름답게 작동합니다. 그러나 예상치 못한 문제는 iOS가 사용자를 대신하여 보여주는 UI 요소가 올바르게 방향이 지정되지 않았기 때문입니다. 즉, 모달 창 및 팝업은 모두 기본 UIView와 동일한 방향을 유지합니다. 그 문제는이 모든 것을 논리적으로 묘사합니다.

+0

UIPopover 방향에 관한 마지막 문제는 1 개의 라이너로 해결할 수 있습니다. [[UIApplication sharedApplication] setStatusBarOrientation : orientation animated : NO]; (그러나, 모달 창은 여전히 ​​이상하게 보인다.) – Mike

관련 문제