iPhone - UIViewController在设备方向改变时不旋转

时间:2009-01-11 11:51:50

标签: iphone cocoa-touch

我有自己的自定义UIViewController,它包含一个带有UIImageView的UIScrollView作为子视图。我希望在设备方向改变时使图像自动旋转,但它似乎不起作用......

在头文件中,我有;

@interface MyViewController : UIViewController <UIScrollViewDelegate> {
    IBOutlet UIScrollView   *containerView;
    UIImageView *imageView;
}

这些组件在loadView函数中初始化,如下所示;

    containerView = [[UIScrollView alloc] initWithFrame:frame];

    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://..."]];
    UIImage *image = [[UIImage alloc] initWithData:data];
    imageView = [[UIImageView alloc] initWithImage:image];
    [image release];

    [containerView addSubview:imageView];

我已经添加了以下方法,假设我需要使视图自动旋转......

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

MyViewController加载了我指定要从URL抓取的图像,并且当我翻转设备时,正在使用正确的UIInterfaceOrientation调用shouldAutorotate ...函数。

然而,didRotateFromInterfaceOrientation方法没有被调用,并且图像似乎没有自己旋转... 有人可以指出我需要添加什么,或者我在这里做错了什么?

提前致谢!

9 个答案:

答案 0 :(得分:26)

这对你来说可能不是正确的答案,因为你没有指定UIViewController的上下文,但我刚刚在Apple文档中发现了一个重要的问题,解释了我遇到的类似问题。

  

标签栏控制器支持纵向   默认情况下方向,不要   旋转到横向   除非所有的根视图   控制器支持这样的   取向。当设备方向   更改发生,标签栏控制器   查询其视图控制器数组。   如果其中任何一个不支持   方向,标签栏   控制器不会改变它   取向。

答案 1 :(得分:3)

我注意到旋转不是第一个或唯一视图的UIView作为主窗口的直接子项时存在问题。

因此,如果你的UIView是导航控制器或标签视图控制器的一部分,你还需要在导航控制器或标签视图控制器上覆盖shouldAutoRotateToInterfaceOrientation。

另外:如果/何时需要手动执行,使用[UIApplication setStatusBarOrientation]有助于解决问题。

答案 2 :(得分:1)

为了使这种事情在我的应用程序中起作用,我不得不重写

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    [self layoutSubviews];
}

以及layoutSubviews

- (void)layoutSubviews
{
    NSLog(@"layoutSubviews called");

    ...recalc rects etc based on the new self.view.bounds...
}

我不确定这是绝对必要的,但它对我有用。

答案 3 :(得分:1)

有时,如果您向视图添加子视图,则您有责任确保将方法传递给子视图;几天前我写了short post这个。例如,如果您有UIViewController并添加UINavigationController作为子视图,则必须将此代码添加到UIViewController,如果您希望在{{1}时调用viewWillAppear:animated: }}出现:

UINavigationController.view

可能需要由superview调用-(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [projectNavigationController viewWillAppear:animated]; } willRotateToInterfaceOrientation方法;我对此并不十分确定,但试一试。

答案 4 :(得分:1)

这在Apple Technical Q&A QA1688中进行了讨论。

有时,如果您将多个视图叠加在一起由于某种原因,则anotherController可能不会收到旋转事件。

[myWindow addSubview:primaryViewController.view];
[myWindow addSubview:anotherController.view];

解决此问题的一种懒惰方式(不是一个好的设计)只在窗口上添加一个子视图,但在应用程序委托上初始化多个控制器。然后,当您需要切换窗口时,删除当前视图并添加所需的视图

[self.view removeFromSuperview];
AppDelegate *dg = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[[dg window] addSubview:[[dg viewController] view]]; 

答案 5 :(得分:0)

我从this link

复制了此内容

它对我有用....我在这里添加这个的原因是为了让其他人更容易找到。我花了很多时间才找到这个问题:

创建一组UIViewController类型的新类文件,进入该类的.h文件并更改此行

@implementation MyTabBarController: UIViewController {}
@end

这样的事情

@implementation MyTabBarController: UITabBarController{

}

现在进入nib文件并单击UITabBarController对象并转到它的标识选项卡,并使其成为Class MyTabBarController。

现在在MyTabBarController.m中确保它在其中。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)io {
     return YES;
}

如果你愿意的话,你可以摆脱那里的一切。

答案 6 :(得分:0)

我刚遇到类似的问题。我有一系列视图控制器/复杂视图,它们完全旋转,无法弄清楚为什么我刚添加的新视图不旋转。经过大量的反复试验,原因是我在分配视图控制器时没有调用init方法(它是标准的init方法); 例如我在做什么

    m_timerViewController = [TimerViewController alloc];

而不是

    m_timerViewController = [[TimerViewController alloc] init];

答案 7 :(得分:0)

扩展jonoogle的帖子。我有类似的错误。我的视图有一个笔尖和我的自定义init:

- (id)initWithCategory:(Category *)category inManagedObjectContext:context{

没有包含对init nib的调用。

self = [super initWithNibName:nil bundle:nil];

添加该行使我的视图像预期的那样旋转。

答案 8 :(得分:0)

如果您要从横向旋转到肖像,请执行此操作!

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}