【问题标题】:iPhone - UIViewController not rotating when device orientation changesiPhone - 设备方向更改时 UIViewController 不旋转
【发布时间】:2009-01-11 11:51:50
【问题描述】:

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

在头文件中,我有;

@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 方法,并且图像似乎没有自行旋转...... 有人可以指出我需要添加什么,或者我在这里做错了什么吗?

提前致谢!

【问题讨论】:

    标签: iphone cocoa-touch


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      因此,如果您的 UIView 是导航控制器或选项卡视图控制器的一部分,您还需要覆盖导航控制器或选项卡视图控制器上的 shouldAutoRotateToInterfaceOrientation。

      另外:如果/当您需要手动操作时,使用 [UIApplication setStatusBarOrientation] 有助于解决问题。

      【讨论】:

      • 是的,具有我想要旋转的 ImageView 的自定义视图控制器确实位于选项卡视图控制器的顶部。我会尝试一下!谢谢埃德 :)
      • 谢谢埃德。我已经实现了我的自定义 UITabViewController 和 UINavigationController,现在它工作得很好。正如你提到的 :) 我还需要制作一些视图以始终保持纵向方向,所以接下来我会继续努力!
      【解决方案3】:

      为了让这种事情在我的应用程序中工作,我必须重写

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

      还有layoutSubviews

      - (void)layoutSubviews
      {
          NSLog(@"layoutSubviews called");
      
          ...recalc rects etc based on the new self.view.bounds...
      }
      

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

      【讨论】:

      • 感谢 frankodwyer 的超快速响应 :) 我将尝试覆盖您提到的 didRotate 委托方法。
      • 您好 frankodwyer,好的,我遇到了一个重大问题。这些委托方法都没有被调用; willRotateToInterfaceOrientation didRotateFromInterfaceOrientation 我需要设置什么才能调用这些方法并正确旋转吗?
      • 我只是将方法添加到我的 ViewController.m 中,没有别的。我检查了一下,两种方法都被调用了。 (附言:最好将后续跟进放在 cmets 中,而不是将它们作为主要问题的答案发布 - 尽管将代码放入 cmets 会很痛苦。或者您可以通过编辑 q 添加更多信息。)
      • 感谢您的建议 :) 我现在只注册了它,所以我现在只使用它......我将尝试用一个 ImageView 实现一个更简单的 ViewController 对象,看看它是如何进行的。再次感谢所有帮助!
      • 我想到的一件事是,您应该确保您的视图在界面生成器中正确连接(即它确实是屏幕上的视图,或者它的子视图)
      【解决方案4】:

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

      -(void)viewWillAppear:(BOOL)animated { 
      [super viewWillAppear:animated];
      [projectNavigationController viewWillAppear:animated];
      }
      

      可能是willRotateToInterfaceOrientationdidRotateFromInterfaceOrientation方法也需要被superview调用;我不太确定,但请尝试一下。

      【讨论】:

      • 这听起来确实类似于我的 UIImageView 问题...我的自定义视图控制器的超级视图是选项卡视图控制器,因此它也可以补充 Ed 之前指出的内容。谢谢坚果走私者:)
      【解决方案5】:

      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]]; 
      

      【讨论】:

        【解决方案6】:

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

            m_timerViewController = [TimerViewController alloc];
        

        而不是

            m_timerViewController = [[TimerViewController alloc] init];
        

        【讨论】:

          【解决方案7】:

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

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

          不包括初始化笔尖的调用。

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

          添加该行使我的视图按预期旋转。

          【讨论】:

            【解决方案8】:

            我从this link复制了这个

            它对我有用....我在这里添加它的原因是为了让其他人更容易找到。我花了好几个小时才找到这个修复:

            新建一套UIViewController类型的类文件,进入该类的.h文件中,修改这一行

            @implementation MyTabBarController: UIViewController {}
            @end
            

            这样的事情

            @implementation MyTabBarController: UITabBarController{
            
            }
            

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

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

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

            如果你愿意,你可能可以摆脱那里的所有其他东西。

            【讨论】:

            • 抱歉,您根本没有回答他的问题!他明确表示他已经有了那行代码!
            【解决方案9】:

            如果您要从横向旋转到纵向,只需执行此操作!

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

            【讨论】:

              猜你喜欢
              • 2020-01-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-06
              相关资源
              最近更新 更多