0

iPhone을 회전시킬 때 레이어를 조정해야하지만, 세로에서 가로로 또는 그 반대로 회전하는 경우에만 조정해야합니다. landscapeLeft가 180도에서 landscapeRight로, 180도에서 portraitUpsideDown으로 회전하면 아무 것도 할 필요가 없습니다. self.interfaceOrientation 이미있다,라고 때문에 시간 willAnimate에 의해,UIViewController는 fromInterfaceOrientation 정보를 어디에 보관합니까?

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration { 
    BOOL bFromPortrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation); 
    BOOL bToPortrait = UIInterfaceOrientationIsPortrait(interfaceOrientation);  
    if (bFromPortrait != bToPortrait) 
      // make adjustments 
} 

이 작동하지 않습니다

그래서 불필요한 동작을 방지하기 위해, 나는 (self 뷰 컨트롤러)이 같은 테스트를 실행 bFromPortrait와 bToPortrait는 항상 같고 조정은 결코 일어나지 않습니다.

willRotate에서이 코드를 실행 해 보았습니다. "interfaceOrientation 속성에는 여전히 뷰의 원래 방향이 포함되어 있습니다."하지만 그 시점에서 레이어의 호스트 뷰의 자동 크기 조정이 수행되지 않았으므로 변경할 방법이 없습니다. 목표 조정을 위해 자동으로 크기가 조정 된 프레임에 액세스하십시오. 그렇지 않으면 조정할 수 없습니다.

그래서 나는 willRotate에서 설정, 아이폰에서 오는 한 방향을 추적하기 위해 부울 특성 bFromPortrait을 추가하고, willAnimate에 액세스 (이 작품) :

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    self.bFromPortrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);  
} 

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    BOOL bToPortrait = UIInterfaceOrientationIsPortrait(toInterfaceOrientation); 
    if (self.bFromPortrait != bToPortrait) 
     // Make adjustments. 
} 

그러나 나는주의 didRotateFromInterfaceOrientation을 오버 클로킹하면 그 fromInterfaceOrientation arg는 정확하게 이후에 이라고 불리는데도, 아이폰의 출처를 정확하게 반영했다. 여분의 부울 속성 bFromPortrait이 필요하지 않아야합니다. UIViewController 이미이 정보를 추적하고있다 -하지만 어디서? 어떻게 접근합니까? 으로 조정할 필요가 있습니다.이 방법은 애니메이션 이후에 실행되므로 조정 사항이 사라집니다. 애니메이션에 조정 사항을 포함하려면 문제가 발생해야합니다. willAnimate) 당신은 끝날이 조금 :)

나는 비슷한 문제를 가지고 생각을 할 수

답변

1

.;

- (void) updateBoundsWithRect:(CGRect)rect 
{ 
    _actionView.frame = rect; 
    self.view.frame = rect; 
} 

당신은 무료 응용 프로그램을 다운로드하고 코드의 결과를 참조하십시오

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
{ 
    CGSize size = self.view.frame.size; 
    CGRect rect; 

    if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) 
    { 
     rect = CGRectMake(0, 0, size.height, size.width); 
    } 
    else 
    { 
     rect = CGRectMake(0, 0, size.width, size.height); 
    } 

    // Views that need updating   
    clockFaceView.frame = rect; 
    hourIndicatorView.frame = rect; 
    minuteIndicatorView.frame = rect; 
    // Update viewControllers 
    [timeInWordsOverlayController updateBoundsWithRect:rect]; 
    [actionOveralyViewController updateBoundsWithRect:rect]; 
} 

updateBoundsWithRect는 다음과 같이 정의된다 : 이것은 내가 문제를 해결하는 데 사용되는 코드입니다. iTunes 링크. 희망이 도움이됩니다.

+0

글쎄, 90도에서 180도까지의 회전을 구별하는 방법에 대한 문제를 정확히 해결하지 못했지만, 코드가 CGSize 속성을 유지하는 또 다른 방법을 제안합니다. 새로운 너비와 높이는 캐시 된 크기와 90도 회전에서만 다릅니다. 세로 대 가로는 너비/높이 비율에 따라 결정될 수 있습니다. 하지만 부울은 더 간단하다고 생각합니다. – Wienke

+0

@Wienke cool. 어떻게이 문제를 결국 해결할 수 있습니까? – haroldcampbell

+0

문제를 두 번째 코드 예제에서 해결할 수있는 주요 문제는 해결됩니다. 제가 궁금해하던 작은 문제는 그 해결 방법이 전혀 필요하지 않은 이유였습니다. 정보는 이미 UIViewController에서 보유하고 있으므로 직접 액세스 할 수 있으면 좋을 것입니다. – Wienke

관련 문제