10

我有一个视图控制器和用于纵向和横向的单独 nib 文件。在旋转时,我加载相应的笔尖。方法

 shouldAutorotateToInterfaceOrientation and willRotateToInterfaceOrientation

被调用并且笔尖确实改变了。

问题:

the landscape nib does not appear as landscape, but portrait! The status bar is
correctly rotated and appears on the top:
(Sorry, couldn't paste the image, because my account is new. The screenshot is in   
landscape, with a landscape status bar, but a landscape view shown as portrait.)

有人会认为问题在于没有将方向设置为 IB Simulated 视图中的横向指标,但我已经这样做了,并且视图在 IB 中显示为横向。(如果视图是纵向的,我认为甚至不可能创建这样的旋转按钮。)除了这两个 nib 之外,我还有一个mainwindow.xib,其中包含应用程序委托、窗口和视图控制器对象。

编辑:我意识到视图实际上是在旋转,当它们应该“保持不变”时。就像有一个额外的转变。当我将手机向右旋转 90° 时,横向 xib 显示为向右旋转 90°。当我将手机再向右旋转 90° 时,纵向 xib 会倒置显示。状态栏始终正确显示在顶部。

EDIT2:使用

self.view.transform = CGAffineTransformMakeRotation((M_PI * (90) / 180.0));

在 willRotateToInterfaceOrientation 中,我可以将视图旋转到左侧横向(以及我想要的任何方向),因此我可以将其用作解决方法。但是,我有其他项目,其中视图自动旋转并且不需要使用 CGAffineTransformMakeRotation。好像有什么东西阻止了这里的自动旋转。

4

2 回答 2

0

我做了与此类似的事情,而不是单独制作一个 nib 文件,我只是将两个子视图添加到主 nib 作为 prtraitView 和 Landscape View

并按如下方式切换它们

在 viewDidAppear 方法中

-(void)viewDidAppear:(BOOL)animated{




    if(UIDeviceOrientationIsPortrait(self.interfaceOrientation))
    {
        self.portraitVIew.frame=self.view.bounds;
        self.portraitVIew.frame=self.view.frame;
        [self.view addSubview:self.portraitVIew];
    }else{
        self.landscapeView.frame=self.view.frame;
        [self.view addSubview:self.landscapeView];
    }
    self.view.autoresizesSubviews = YES;




    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(deviceOrientationDidChangeNotification:)
     name:UIDeviceOrientationDidChangeNotification
     object:nil];


}

然后实现 deviceOrientationDidChangeNotification 如下

- (void)deviceOrientationDidChangeNotification:(NSNotification*)note
{

    if ([[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad) {

    }else{
        UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
        if(UIDeviceOrientationIsLandscape(self.interfaceOrientation))
        {
            self.landscapeView.hidden=NO;
            self.landscapeView.frame=self.view.frame;
            [self.portraitVIew removeFromSuperview];


            [self.view addSubview:self.landscapeView];
        }else {
            self.landscapeView.hidden=YES;
            self.portraitVIew.frame=self.view.frame;
            NSLog(@"Portrait");

            [self.view addSubview:self.portraitVIew];
        }
    }



}

它对我来说非常有效..

于 2014-07-24T05:42:35.173 回答
0

您是否view将从 nib 加载的内容添加为子视图?如果只有状态栏在旋转,则表示您之前的视图在释放视图并添加新视图时挂起。您能告诉您如何将加载的视图添加xib到 SuperView。

确保在加载另一个视图时正确释放前一个NSLOG视图,放入视图的释放并检查视图是否完全释放。

于 2012-08-28T10:36:50.197 回答