以编程方式切换视图时,iOS7自动调整大小

时间:2014-06-12 14:57:33

标签: objective-c ios7 uiviewcontroller

我已经用谷歌搜索了几个小时而没有运气,所以我来找你们这些来救我吧!

显然,我无法找到关于如何做到这一点(或最佳方式)的正确信息。我有一个支持肖像和风景的应用程序(虽然不支持颠倒)。但是,纵向和横向视图完全不同,因此我需要使用两个视图来表示每个视图。假设我在故事板中需要3个viewcontrollers(主要是一个,然后一个用于肖像,一个用于风景?我是否会使用两个但是我没有看到如果我从肖像开始,并且然后需要加载横向,我将不得不删除肖像,这是我的代码所在的位置?

我的viewcontroller有正确的约束来保持标签顶部居中,但是当以编程方式替换或交换视图时,似乎不会调用自动调整大小。我最后通过重置子视图上的帧来修复此问题,但现在当设备颠倒翻转时,纵向标签将永远向右移动。所以我想知道正确的方法,因为我确信这不可能。

就代码而言,我有一个obj-c viewcontroller类,其中包含以下修改过的方法......

@interface AMBViewController ()

@property (strong, nonatomic) UIViewController *portraitViewController;
@property (strong, nonatomic) UIViewController *landscapeViewController;

@end

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    UIApplication *app = [UIApplication sharedApplication];
    UIInterfaceOrientation currentOrientation = app.statusBarOrientation;
    [self doLayoutForOrientation:currentOrientation];
}

-(void) willAnimateRotationToInterfaceOrientation:
(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self doLayoutForOrientation:toInterfaceOrientation];
}

-(void) doLayoutForOrientation:(UIInterfaceOrientation)orientation {

    if (UIInterfaceOrientationIsPortrait(orientation)) {
        self.portraitViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Portrait"];

        if (self.landscapeViewController != nil ) {
            [self.landscapeViewController.view removeFromSuperview];
            self.landscapeViewController = nil;
        }

        self.portraitViewController.view.frame = self.view.bounds;
        [self.view insertSubview:self.portraitViewController.view atIndex:0];
    } else {
        self.landscapeViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Landscape"];

        if (self.portraitViewController != nil ) {
            [self.portraitViewController.view removeFromSuperview];
            self.portraitViewController = nil;
        }

        self.landscapeViewController.view.frame = self.view.bounds;
        [self.view insertSubview:self.landscapeViewController.view atIndex:0];
    }

}

为了清楚我的故事板,我有一个空白根控制器(子类AMBViewController)和另外两个视图控制器“Landscape”和“Portrait”

我可能还会提到,如果您将设备旋转一整圈(4个右侧或4个左侧旋转),标签仅在纵向视图中脱落。如果你向右走(现在它是颠倒的)但是然后向左走,它仍然很好。只有当屏幕从右/左景观翻转到左/右景观时,它才会混乱。真的很奇怪,我知道我必须省略一些重要的事情。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

解决方案:找到位于Apple's Dev Site的指南(最后)后,我能够使用segues和模态窗口找到解决方案。第一视图控制器是纵向,第二视图控制器是横向,通过模态segue连接。第一个视图控制器具有以下修改方法:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    _isShowingLandscapeView = NO;

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(orientationChanged:)
                                                 name:UIDeviceOrientationDidChangeNotification
                                               object:nil];
}

-(void) orientationChanged:(NSNotification *)notification {
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;

    if (UIInterfaceOrientationIsPortrait(orientation) && _isShowingLandscapeView
        && orientation != UIInterfaceOrientationPortraitUpsideDown) {

        [self dismissViewControllerAnimated:NO completion:nil];
        _isShowingLandscapeView = NO;

    } else if (UIInterfaceOrientationIsLandscape(orientation) && !_isShowingLandscapeView ) {

        [self performSegueWithIdentifier:@"ShowLandscape" sender:self];
        _isShowingLandscapeView = YES;

    }
}

感谢所有可能已经调查过的人!