는 다음과 같이 ShouldAutorotateToInterfaceOrientation
아이폰 OS 6에서 사용되지 않는 내가 그에게 특정 뷰를 강제로 사용되는 세로 만 , 아이폰 OS 6에서이 작업을 수행하는 올바른 방법은 무엇입니까? 이것은 내 앱의 한 영역에만 해당되며 다른 모든보기는 회전 할 수 있습니다.
답변:
모든 내비게이션 컨트롤러가 상위 뷰 컨트롤러를 존중하도록하려면 카테고리를 사용하여 여러 클래스 이름을 살펴보고 변경할 필요가 없습니다.
@implementation UINavigationController (Rotation_IOS6)
-(BOOL)shouldAutorotate
{
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
@end
일부 의견에서 지적했듯이 이것은 문제에 대한 빠른 수정입니다. 더 나은 솔루션은 UINavigationController 하위 클래스이며 이러한 메서드를 거기에 배치하는 것입니다. 하위 클래스는 6과 7을 지원하는데도 도움이됩니다.
iOS6를위한 가장 좋은 방법은 Ray Wenderlich 팀의 "iOS6 By Tutorials"( http://www.raywenderlich.com/ )에 명시되어 있으며 UINavigationController
대부분의 경우 서브 클래 싱보다 낫습니다 .
UINavigationController
초기 뷰 컨트롤러로 세트 가 포함 된 스토리 보드와 함께 iOS6를 사용하고 있습니다 .
//AppDelegate.m-불행히도 iOS6 이전에는이 메서드를 사용할 수 없습니다.
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;
if(self.window.rootViewController){
UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
orientations = [presentedViewController supportedInterfaceOrientations];
}
return orientations;
}
//MyViewController.m-각각에 대해 지원하려는 방향을 반환합니다. UIViewController
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
이 답변은 OP 게시물의 의견에서 묻는 질문과 관련이 있습니다.
뷰가 주어진 방향으로 나타나도록 강제하려면 viewWillAppear에 다음을 넣으십시오.
UIApplication* application = [UIApplication sharedApplication];
if (application.statusBarOrientation != UIInterfaceOrientationPortrait)
{
UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
}
약간의 해킹이지만 UIViewController
이전 컨트롤러가 가로 모드 인 경우에도 세로로 표시되도록 강제합니다.
iOS7 업데이트
위의 방법은 이제 더 이상 사용되지 않으므로 iOS 7의 경우 다음을 사용하십시오.
UIApplication* application = [UIApplication sharedApplication];
if (application.statusBarOrientation != UIInterfaceOrientationPortrait)
{
UIViewController *c = [[UIViewController alloc]init];
[c.view setBackgroundColor:[UIColor redColor]];
[self.navigationController presentViewController:c animated:NO completion:^{
[self.navigationController dismissViewControllerAnimated:YES completion:^{
}];
}];
}
흥미롭게도, 기록의 시간에 하나 , 본 해제 또는 애니메이션되어야한다. 둘 다 그렇지 않으면 흰색 화면이 나타납니다. 이것이 왜 작동하는지 모르겠지만 작동합니다! 시각적 효과는 애니메이션에 따라 다릅니다.
그래서 세로 모드 만 표시 할 때 동일한 문제가 발생했습니다. 일반적으로, 나는를 만들 것 UINavigationController
, 설정된 viewController
는 AS를 rootViewController
다음을 표시 UINavigationController
모달보기로. 그러나 iOS 6에서는 viewController
이제 navigationController에 지원되는 인터페이스 방향 (기본적으로 모두 iPad 용이고 iPhone 용은 거꾸로되어 있음)을 묻습니다.
솔루션 : UINavigationController
자동 회전 메서드 를 하위 클래스로 만들고 재정의해야했습니다. 일종의 절름발이.
- (BOOL)shouldAutorotate {
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
// pre-iOS 6 support
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
IOS 5
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
IOS 6
-(BOOL)shouldAutorotate{
return YES;
}
-(NSInteger)supportedInterfaceOrientations{
// UIInterfaceOrientationMaskLandscape;
// 24
//
// UIInterfaceOrientationMaskLandscapeLeft;
// 16
//
// UIInterfaceOrientationMaskLandscapeRight;
// 8
//
// UIInterfaceOrientationMaskPortrait;
// 2
// return UIInterfaceOrientationMaskPortrait;
// or
return 2;
}
UIViewController 회전 메서드가 범주 자체에서 선언되어 다른 범주에서 재정의하면 정의되지 않은 동작이 발생하기 때문에 @aprato 대답에 동의하지 않습니다. UINavigationController (또는 UITabBarController) 하위 클래스에서 재정의하는 것이 더 안전합니다.
또한 이것은 가로보기에서 세로 전용 VC로 또는 그 반대로 푸시 / 프레젠테이션 / 팝 시나리오를 다루지 않습니다. 이 어려운 문제를 해결하려면 (Apple에서 해결하지 않음) 다음을 수행해야합니다.
iOS <= 4 및 iOS> = 6 :
UIViewController *vc = [[UIViewController alloc]init];
[self presentModalViewController:vc animated:NO];
[self dismissModalViewControllerAnimated:NO];
[vc release];
iOS 5에서 :
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIView *view = [window.subviews objectAtIndex:0];
[view removeFromSuperview];
[window addSubview:view];
이것들은 UIKit이 모든 shouldAutorotate, supportedInterfaceOrientations 등을 재평가하도록 강제합니다.
https://stackoverflow.com/a/13982508/2516436 및 https://stackoverflow.com/a/17578272/2516436을 혼합하는 매우 좋은 접근 방식이 있습니다.
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;
if(self.window.rootViewController){
UIViewController *presentedViewController = [self topViewControllerWithRootViewController:self.window.rootViewController];
orientations = [presentedViewController supportedInterfaceOrientations];
}
return orientations;
}
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
if ([rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController* tabBarController = (UITabBarController*)rootViewController;
return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
} else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)rootViewController;
return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
} else if (rootViewController.presentedViewController) {
UIViewController* presentedViewController = rootViewController.presentedViewController;
return [self topViewControllerWithRootViewController:presentedViewController];
} else {
return rootViewController;
}
}
각 UIViewController에 대해 지원하려는 방향을 반환합니다.
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
UISplitViewController 및 UISegmentedController를 사용하는 비교적 복잡한 범용 앱이 있으며 presentViewController
. 위에서 제안한 방법을 사용하여 iPhone ios 5 및 6이 정상적으로 작동하도록 할 수 있었지만 어떤 이유로 iPad는 단순히 Landscape로 표시하는 것을 거부했습니다. 마지막으로 장치와 iOS 5 및 6 모두에서 작동하는 간단한 솔루션 (몇 시간 동안 읽고 시행 착오를 거쳐 구현 됨)을 찾았습니다.
1 단계) 컨트롤러에서 필요한 방향을 지정합니다 (위에 언급 된대로 다소간).
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
-(BOOL)shouldAutorotate
{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
NSInteger mask = UIInterfaceOrientationMaskLandscape;
return mask;
}
2 단계) 간단한 UINavigationController 하위 클래스를 만들고 다음 메서드를 구현합니다.
-(BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
3 단계) viewController 제시
vc = [[MyViewController alloc]init];
MyLandscapeNavigationController *myNavigationController = [[MyLandscapeNavigationController alloc] initWithRootViewController:vc];
[self myNavigationController animated:YES completion:nil];
이것이 누군가에게 도움이되기를 바랍니다.
여기서 지루하지는 않지만 하위 클래스를 공유하는 데 너무 친절합니까? 감사합니다.
편집 : 글쎄, 마침내 해냈고, 하위 클래스는 간단했습니다. 난 그냥 선언했다 navigationController
에 AppDelegate
로 UINavigationControllerSubclass
대신 기본 UINavigationController
, 다음 서브 클래스를 함께 수정 :
- (BOOL)shouldAutorotate {
return _shouldRotate;
}
를 호출하여 회전하거나 원하지 않는 뷰를 설정할 수 있습니다. viewDidLoad
_navController = (UINavigationController *)self.navigationController;
[_navController setShouldRotate : YES / NO]
이 조정이 다른 사람들에게도 도움이되기를 바랍니다. 팁에 감사드립니다!
팁 : 활용
- (NSUInteger)supportedInterfaceOrientations
따라서 뷰 컨트롤러에서 가로로 원하는 세로보기로 끝나지 않으며 그 반대의 경우도 마찬가지입니다.
Monotouch의 경우 다음과 같이 할 수 있습니다.
public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()
{
return UIInterfaceOrientationMask.LandscapeRight;
}
public override UIInterfaceOrientation PreferredInterfaceOrientationForPresentation()
{
return UIInterfaceOrientation.LandscapeRight;
}
나는 많은 대답을 보았지만 방향에 대한 특정 아이디어와 대답을 얻지 못했지만 링크가 방향을 잘 이해하고 ios6의 강제 회전을 제거하는 것을 봅니다.
http://www.disalvotech.com/blog/app-development/iphone/ios-6-rotation-solution/
나는 그것이 완전한 도움이라고 생각합니다.
project.plist로 이동 한 다음 지원되는 인터페이스 방향을 추가 한 다음 세로 (홈 하단 버튼) 및 세로 (홈 상단 버튼) 만 추가하면됩니다.
프로젝트 요구 사항에 따라 방향을 추가하거나 제거 할 수 있습니다.
감사
1) 프로젝트 설정 및 info.plist를 확인하고 원하는 방향 만 선택되었는지 확인합니다.
2) 최상위 뷰 컨트롤러 (내비게이션 컨트롤러 / 탭바 컨트롤러)에 다음 메서드를 추가합니다.
- (NSUInteger) supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
3) 앱 델리게이트에 다음 메서드를 추가합니다.
- (NSUInteger) supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskPortrait;
}