Using iOS 8.3
I have a view in landscape mode, and i'm trying to open a portrait only view controller. every time i try to open it, the app crashes.
I have read this official apple answer which basically recommends doing the following:
in the app delegate:
@implementation AppDelegate
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
return UIInterfaceOrientationMaskAll;
else /* iphone */
return UIInterfaceOrientationMaskAllButUpsideDown;
}
and in my controller:
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
And so i have, and yet i still get this crash message:
Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and [PUUIAlbumListViewController shouldAutorotate] is returning YES
In the project general settings i have the following (which should not be changed according to apple's answer):
I can see that these functions are in fact being called but nothing helps. Any thoughts?
Some questions i read earlier:
How to force a UIViewController to Portrait orientation in iOS 6
iOS6: supportedInterfaceOrientations not working (is invoked but the interface still rotates)
Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES'
Synopsis: application(_:, supportedInterfaceOrientationsForWindow) -> Int
does overwrite the General > Deployment Info. So you can ignore that .plist entirely once you provide supportedInterfaceOrientationsForWindow
in the app delegate. See note about UIInterfaceOrientationMaskPortrait
.
Having tried the code above every which way, in both Obj-C and Swift, the only times I get...
'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and [ViewController shouldAutorotate] is returning YES'
...is when:
UIInterfaceOrientationPortrait
instead of UIInterfaceOrientationMaskPortrait
(mask is the keyword here)supportedInterfaceOrientations
returns a mask not listed in supportedInterfaceOrientationsForWindow
A. Place this block in the the class adopting the UIApplicationDelegate
protocol (typically AppDelegate.m
or AppDelegate.swift
):
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
return UIInterfaceOrientationMaskAll;
else /* iphone */
return UIInterfaceOrientationMaskAllButUpsideDown;
}
supportedInterfaceOrientations
will overwrite the Deployment Info and allow to dynamically differentiate iPhone from iPad at runtime.
B. Place this block in the UIViewController
subclass for which you want a specific behavior (typically CustomViewController.m
or CustomViewController.swift
):
Obj-C
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
Swift
override func supportedInterfaceOrientations() -> Int {
let supported = UIInterfaceOrientationMask.Portrait.rawValue
return Int(supported)
}
Tested iOS 8.4
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With