当前位置: 首页 > 知识库问答 >
问题:

未调用子视图控制器旋转方法

成浩漫
2023-03-14

我正在尝试将子视图控制器添加到父视图控制器,并让父视图控制器通知子视图控制器旋转事件。但是,旋转消息不会转发到子视图控制器(这是默认行为)。为什么没有发生这种默认行为?

环境:iOS 7、XCode 5、OSX 10.9

我正在按照Apple文档中的说明实现一个自定义容器视图控制器:“创建自定义容器视图控制器”。我试图建立一个简单的父子关系来转发旋转事件。总体层次结构与此处重新绘制的文档图14-1所示完全相同:

ParentViewController --------> RootView
        |                       /   \
        |                      /     \
        ˅                     /       \
ChildViewController ---> ChildView     \ 
                                        \   
                                    OverLayView

我正在使用父级ViewController(unityViewController=ChilViewController,unityView=ChilView)中文档清单4-1中的代码来完成此操作:

// In the ParentViewController    
// Called by the Application Delegate in application:didFinishLaunchingWithOptions:
- (void)addUnityViewController:(UIViewController *)unityViewController withUnityView:(UIView *)unityView
{
    [self addChildViewController:unityViewController]; // 1. Establish Child parent relationship

    unityView.frame = self.view.frame;                 // 2. Set the frame (explicitly or with constraints)
    [self.view addSubview:unityView];                  // 2.1 Add the subview AFTER you set the frame
    ... // add some view constraints here

    [self.view sendSubviewToBack:unityView];           // In the back, but not completely obstructed by any other views
    [unityViewController didMoveToParentViewController:self];// 3. Tell the child what happened
}

此代码成功地将子视图显示为RootView的子视图,OverlayView添加了一些功能按钮。但是,当设备旋转时,父视图控制器会成功旋转其视图,但不会将旋转消息转发到子视图控制器(unityViewController),从而导致在rootView中不正确地显示子视图(unityView)。根据“创建自定义容器视图控制器”,这应该会自动发生:

自定义外观和旋转回调行为:将子容器添加到容器后,一旦发生需要转发消息的事件,容器就会自动将旋转和外观回调转发给子视图控制器。

为了确保这种情况发生,我否决了以下方法:

// In the parent ViewController:
- (BOOL)shouldAutorotate
{
    return YES;
}

- (BOOL)shouldAutomaticallyForwardAppearanceMethods
{
    return YES;
}

- (BOOL)shouldAutomaticallyForwardRotationMethods
{
    return YES;
}

但是,永远不会调用子viewController(unityViewController)中的will RotateToInterfaceOrience:持续时间:和didRotateFromInterfaceOrience:方法。我已经能够确认确实正在调用父方法,并且在这些方法中我调用了Super,但从未有过调用子方法。

这种默认行为没有发生的原因是什么?我需要父母和孩子都能收到旋转消息,以便正确显示。

注意:我知道我可以在父级中手动调用这些方法,但我不想手动调用这些方法并添加默认行为的额外代码。

非常感谢您的帮助!

共有2个答案

巫马望
2023-03-14

您可能需要在子视图上设置AutoresizingMask:

[childView setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];

这可以确保视图在旋转期间与其父视图一起调整大小。

姜玮
2023-03-14

为了使子视图控制器接收转发的方向回调,它必须可见。您的子视图控制器可能不可见,因为其视图尚未添加到视图层次结构中。

如果将方法更改为此,则应开始看到正在调用的旋转消息:

- (void)addUnityViewController:(UIViewController *)unityViewController 
{
    [self addChildViewController:unityViewController];

    unityViewController.view.frame = self.view.bounds;
    [self.view addSubview:unityViewController.view];
    ... // add some view constraints here

    [self.view sendSubviewToBack:unityViewController.view];       
    [unityViewController didMoveToParentViewController:self];
}

有关详细信息:响应可见视图控制器中的方向更改。

 类似资料:
  • 我想做的是: 由父视图控制器管理的父视图不应旋转。 由子视图控制器管理的子视图应该旋转到所有方向。 我所尝试的: 家长视图控制器 儿童视图控制器 Xcode部署信息中支持的方向设置为所有四个。 我得到的: 没有视图的旋转。如果将父视图的旋转设置为“全部”,则所有视图将一起旋转。所以要么全有要么全无。 更新 当我尝试放置UIDeviceOrientationIDChangeNotification的

  • 我有一个带有子视图控制器的视图控制器。 应强制A始终保持纵向,但应允许B自由旋转。 我知道shouldAutorotate应该适用于任何视图控制器及其子级,但有什么方法可以绕过它吗?看起来我可以使用shouldAutorotateToInterfaceOrientation,但这在iOS 8中被阻止了。 我想保持视频播放器静态(因此无论设备方向如何,水平视频始终是水平的),而控制层子视图覆盖允许自

  • 本文向大家介绍C#控制图像旋转和翻转的方法,包括了C#控制图像旋转和翻转的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#控制图像旋转和翻转的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 我没有找到有关此问题的文章,但没有一个解决我的问题。 就像我说的那样。 ViewControllerA ViewControllerB 我试图将添加为的子视图,但是它 抛出类似“ ” 的错误。 下面是代码… ViewControllerA ViewControllerB只是一个带有标签的简单屏幕。 ViewControllerB EDIT 根据用户答案的​​建议解决方案,ViewCon

  • 我找到了一些关于这个问题的帖子,但是没有一个能解决我的问题。 说像我已经... ViewControlllerA ViewControlllerB 我试图将ViewControlllerB添加为ViewControlllerA中的子视图,但是,它抛出了一个错误,如""。 下面是代码。。。 视图控制器 ViewControllerB只是一个带有标签的简单屏幕。 视图控制器B 编辑

  • 以下的一段代码相当于定义一个ParameterizableViewController视图控制器的快捷方式,该控制器会立即将一个请求转发(forwards)给一个视图。请确保仅在以下情景下才使用这个类:当控制器除了将视图渲染到响应中外不需要执行任何逻辑时。 以下是一个例子,展示了如何在MVC Java编程配置方式下将所有"/"请求直接转发给名字为"home"的视图: @Configuration