1

iOS 6 용 앱을 업데이트하려고하는데 주요 과제는 자동 회전입니다. 이 주제와 관련된 질문 및 검색 결과가 있지만 내 질문에 직접 답하는 것은 없습니다. shouldAutorotateToInterfaceOrientation:과 그 대체품 인 supportedInterfaceOrientationsshouldAutorotate의 사용 중단에 대해 알고 있습니다.이 질문에 직접적인 영향을주지는 않습니다.iOS 6에서 willAutorotateToInterfaceOrientation을 어떻게 대체 할 수 있습니까?

대신 내 애플이 회전 애니메이션과 레이아웃 재구성을 거의 다 처리하는 곳인 willAutorotateToInterfaceOrientation:duration:을 어떻게 대체 할 수 있는지 알고 싶습니다. 내 메인보기 컨트롤러는 실행시 기본 창에 추가되고 앱의 전체 내부 레이아웃을 처리하는 전체 화면보기를 제어합니다. 이는 다소 복잡합니다. 이 뷰 컨트롤러의 willAutorotateToInterfaceOrientation:duration: 메서드는 일부 하위 뷰의 크기를 직접 조정하고 다른 하위 뷰를 처리하는 C++ 개체를 호출합니다. 가변적 인 하위 뷰를 포함하는 인터페이스의 가변적 인 특성, 크기를 조정하지 않는 일부, 오프 스크린 등의 일부가 포함되어 있기 때문에 Apple의 자동 크기 조정 마스크가 이런 종류의 자동 회전을 처리 할 수있는 충분한 솔루션을 제공한다고 생각하지 않습니다 .

willAutorotateToInterfaceOrientation:duration:과 같은 방식으로 조치를 취하는 방법이 있습니까? 내가 온라인에서 그리고 실험을 통해 발견 했으므로이 방법과 didRotateFromInterfaceOrientation:은 iOS 6의 메인보기 컨트롤러에서 호출되지 않습니다. 어쨌든 viewWillLayoutSubviews은 결코 호출되지 않습니다. .

추가 정보가 필요하면 알려주십시오. 이것에 대한 솔직한 솔류션이 있기를 바란다. 그리고 이것은 애플이 새롭고 더 좁은 프로토콜을 따르지 않는다면 늑대에게 개발자를 포기한 사례가 아니다.

편집 :

AppDelegate.mm에서 :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    [self.window makeKeyAndVisible]; 
    MainViewController* mainViewController= [[MainViewController alloc] initWithNibName:nibName bundle:[NSBundle mainBundle]]; 
    [self.window addSubview:mainViewController.view]; 
    return YES; 
} 

MainViewController 이것은 명확히하는 데 도움이 경우가 여기에 기본 I 이야기하고있는 기능의 껍질입니다. mm :

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

    [UIView beginAnimations:NULL context:nil]; 
    [UIView setAnimationDuration:duration]; 
    [someViewController someMethod]; 
    [someView setFrame:someRect]; 
    [UIView commitAnimations]; 

    someObject->CustomRotationFunction(toInterfaceOrientation, duration); 
} 

Genera lly 말하자면, 이러한 함수와 메소드에서 계속 진행되는 것에 대해 최악의 상황을 가정합니다. someObject은 프레임을 변경하는보기를 소유하고 있으며, 프레임을 변경하는보기를 소유 한 다른 객체를 소유하고 있습니다.

+0

[WWDC 2012] (http://developer.apple.com/itunes/?destination=adc.apple.com.16351493766) 세션 (236)에 대해 23에서 시작하고 이에 대한 논의의 절반 분.어떤 종류의 미친 구현이 있는지 전혀 모르기 때문에 여기에서 좋은 대답을하는 것은 어렵습니다. 그래서 먼저 비디오를 보시기 바랍니다. –

답변

3

주된 문제점은 ViewController의보기를 rootViewController로 설정하는 대신 창에 추가하는 것입니다. 그래서 willRotateToInterfaceOrientation, didRotateToInterfaceOrientation 등은 iOS6에서 호출되지 않습니다.

iOS5에서, shouldAutorotateToInterfaceOrientation은 윈도우에 있던 ViewController의 모든 childViewController에 전달되었으며, 회전 할 것인지 여부를 반환 할 수 있습니다. iOS6에서 rootViewController는 애플리케이션이 특정 방향을 지원하는지 여부를 결정합니다. 따라서 iOS6에 rootViewController를 설정해야하며 이전 iOS 버전에서도 rootViewController를 설정하는 것이 가장 좋습니다. 그러면 필요한 메서드가 올바른 시간에 호출되어 모든 childViewController에 전달됩니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    [self.window makeKeyAndVisible]; 
    MainViewController* mainViewController= [[MainViewController alloc] initWithNibName:nibName bundle:[NSBundle mainBundle]]; 
    self.window.rootViewController = mainViewController; 
    return YES; 
} 
+0

매력처럼 작동합니다! 고맙습니다! – Luke