我的iOS 7应用程序正常运行。我今天尝试使用Xcode 6,当我运行它时,我有一个令人讨厌的惊喜:(:
您可以看到Xcode现在绘制我的viewController,就像它处于纵向模式一样,但正如您所看到的那样是横向模式。
你知道iOS 8中有什么变化吗? :/ 我使用了以下定位方法:
编辑:
我发现这个方法:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskLandscape;
}
现在我的第一个viewcontrollers工作正常:)。问题是当我显示一个模态(改变UIInterfaceOrientationMaskAll中的方法集)时重新制作截图的丑陋效果。 确切地说,我在这种模式下改变了我的方法:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if(self.restrictRotation)
{
return UIInterfaceOrientationMaskLandscape;
}
else
{
return UIInterfaceOrientationMaskAll;
}
}
// THIS IS A DELEGATE OF MODAL VIEW CONTROLLER
- (void)updateInterfaceAfterDocumentPreviewViewController
{
NSLog(@"updateInterfaceAfterDocumentPreviewViewController");
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];
AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
appDelegate.restrictRotation = YES;
}
答案 0 :(得分:16)
请尝试以下代码
didFinishLaunchingWithOptions
的{{1}}
AppDelegate
答案 1 :(得分:8)
问题似乎是设置窗口时的调用顺序。在您的makeKeyAndVisible
方法中为应用代表分配rootViewController
之前,您需要致电didFinishLaunchingWithOptions
。以下作品:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
self.window.rootViewController = self.myMainViewController;
但如果您将订单更改为:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = self.myMainViewController;
[self.window makeKeyAndVisible];
您会遇到您遇到的行为。
答案 2 :(得分:1)
我在“加载屏幕”中遇到了同样的问题。这对我有用。 (请注意:我的应用仅支持iOS 7或更高版本,横向模式。):
CGRect theFrame = self.view.frame;
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
CGRect screenBounds = [[UIScreen mainScreen] bounds];
theFrame.origin = CGPointZero;
theFrame.size.width = screenBounds.size.height;
theFrame.size.height = screenBounds.size.width;
}
NSLog(@"%@", [NSNumber valueWithCGRect:theFrame]);
self.loadingScreen = [[UIView alloc] initWithFrame:theFrame];
如果您的应用支持纵向方向和“计算正确的applicationFrame的长路”,请参阅Mike Hay的答案: https://stackoverflow.com/a/18072095/4108485
希望这有帮助。
答案 3 :(得分:1)
查看您的.plist文件。
答案 4 :(得分:1)
我遇到了类似的问题,我无法获得正确的启动图像显示(我有两个用于iPad,Default-Portrait.png和Default-Landscape.png)我也无法获得应用程序本身启动图像消失后自动定位。
解决启动图像的问题:
首先解决应用方向问题ViewController:
答案 5 :(得分:0)
检测方向的方法是deprecated in iOS8(但现在仍然允许)。 它被大小类和Trait Collections的概念所取代。
(奇怪的是,我现在似乎无法在Apple的在线文档中找到尺寸等级参考 - 会发誓它之前有过 - 可能在XCode中)。见here for WWDC videos.
无论如何,Interface Builder中有一个复选框,上面写着“Use Size Classes”。 可能你已经检查过了。关掉它&amp;看看这有帮助吗?
答案 6 :(得分:0)
Oldschool解决方案:
BOOL portrait;
BOOL iOS8OrLater = ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0);
if (iOS8OrLater) {
CGFloat height = CGRectGetHeight(self.view.frame);
CGFloat width = CGRectGetWidth(self.view.frame);
if (width / height > 1.0) {
portrait = NO;
} else {
portrait = YES;
}
} else {
portrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
}
if(portrait) {
[self layoutPortrait];
} else {
[self layoutLandscape];
}
您可以在viewWillLayoutSubviews
中调用此方法答案 7 :(得分:0)
UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;
if( UIDeviceOrientationIsLandscape( currentOrientation ) )
{
if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
// -- Fix for rotation issue for ios 8
if( IS_IOS_8_OR_LATER )
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad"
bundle: nil];
// -- Set frame of nav controller
UINavigationController *nc = [storyboard instantiateViewControllerWithIdentifier:@"NavController"];
self.window.rootViewController = nc;
[self.window setFrame:[[UIScreen mainScreen] bounds]];
// -- Set fame of home view controller
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"Home"];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]];
}
}
}