故事板方向支持xCode 4.2?

时间:2011-10-18 06:59:02

标签: iphone landscape storyboard xcode4.2 device-orientation

我升级到xCode 4.2,它是新的Storyboards功能。然而,找不到支持肖像和风景的方法。

当然,我是以编程方式完成的,有2个视图,一个用于纵向,一个用于横向,就像过去一样,并且:

if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    {
        self.view = self.landscapeView;
    }
    else
    {
        self.view = self.portraitView;
    }

但我正在寻找一种方法以某种方式自动执行此操作。我的意思是,现在是xCode 4.2,我期待更多。谢谢大家。

==================================
临时解决方案:

我将在这里提出一个临时解决方案。我说这是暂时的,因为我还在等苹果公司做一些非常聪明的事情。

我创建了另一个.storyboard文件,名为“MainStoryboard_iPhone_Landscape”,并在那里实现了横向视图控制器。实际上,它与普通(肖像)。存储板完全一样,但所有屏幕都处于横向模式。

所以我将从横向故事板中提取ViewController,当轮换发生时,只需使用新的viewController视图更改self.view。

1.方向更改时生成通知:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

2.寻找通知:

[[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceOrientationDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {    
    // We must add a delay here, otherwise we'll swap in the new view  
    // too quickly and we'll get an animation glitch  
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}];

3.Implement updateLandscapeView

- (void)updateLandscapeView {  
 //>     isShowingLandscapeView is declared in AppDelegate, so you won't need to declare it in each ViewController
 UIDeviceOrientation deviceOrientation       = [UIDevice currentDevice].orientation;
 if (UIDeviceOrientationIsLandscape(deviceOrientation) && !appDelegate().isShowingLandscapeView)
 {
     UIStoryboard *storyboard                = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_Landscape" bundle:[NSBundle mainBundle]];
     MDBLogin *loginVC_landscape             =  [storyboard instantiateViewControllerWithIdentifier:@"MDBLogin"];
     appDelegate().isShowingLandscapeView    = YES;  
     [UIView transitionWithView:loginVC_landscape.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseIn animations:^{
         //>     Setup self.view to be the landscape view
         self.view = loginVC_landscape.view;
     } completion:NULL];
 }
 else if (UIDeviceOrientationIsPortrait(deviceOrientation) && appDelegate().isShowingLandscapeView)
 {
     UIStoryboard *storyboard                = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:[NSBundle mainBundle]];
     MDBLogin *loginVC                       = [storyboard instantiateViewControllerWithIdentifier:@"MDBLogin"];
     appDelegate().isShowingLandscapeView    = NO;
     [UIView transitionWithView:loginVC.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseIn animations:^{
         //>     Setup self.view to be now the previous portrait view
         self.view = loginVC.view;
     } completion:NULL];
 }}

祝大家好运。

P.S:我会接受Ad Taylor的回答,因为经过很长时间等待并寻找解决方案之后,我最终实现了一些灵感来自他的回答。谢谢Taylor。

3 个答案:

答案 0 :(得分:6)

这是一个老问题,但我在当天早些时候读到这个问题,然后不得不花费相当多的时间来制定更好的解决方案。我通过攻击Apple Alternate View example来提出这个解决方案。基本上它正在为景观视图提供模态视图。

#pragma mark Rotation view control

- (void)orientationChanged:(NSNotification *)notification
{
    // We must add a delay here, otherwise we'll swap in the new view
    // too quickly and we'll get an animation glitch
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}

- (void)updateLandscapeView
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && !self.isShowingLandscapeView)
    {
        [self performSegueWithIdentifier: @"toLandscape" sender: self];
        self.isShowingLandscapeView = YES;
    }
    else if (deviceOrientation == UIDeviceOrientationPortrait && self.isShowingLandscapeView)
    {
        [self dismissModalViewControllerAnimated:YES];
        self.isShowingLandscapeView = NO;
    }    
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

答案 1 :(得分:3)

你通常不应该考虑不同方向的不同观点,除非它们有很大的不同(可以说,它们不应该是)。相反,当superview的框架发生变化时,你应该依靠autoresizing masks根据基本限制来布置你的视图内容。这将允许子视图对其超级视图框架中的更改做出适当响应,通常是由于界面方向更改。

更直接地回答你的问题,不,Xcode没有办法假设或被告知你想要用于特定界面方向的视图,因为这绝不是UIKit视图架构的意图

以下是有关自动调整蒙版的更多信息:Handling Layout Changes Automatically Using Autoresizing Rules

答案 2 :(得分:3)

在XCode v4.2.1中使用StoryBoards时,你只能改变视图控制器的方向,而不能改变视图本身,所以如果你在那里插入了另一个视图,你将无法改变它的方向,即使你可以正确地看到视图。

因此,当使用StoryBoards时(使用NIB时,单独的视图可以更改视图方向)​​,以前使用两个视图的方式似乎不起作用。