【问题标题】:resizing the second child view controllers view in iPad在 iPad 中调整第二个子视图控制器视图的大小
【发布时间】:2014-02-02 00:29:54
【问题描述】:

我正在做一个 PhoneGap iPad 应用程序。在此,我添加了一个 HybridPage(其中包含 webView)作为子视图控制器,然后在该屏幕之后我添加了一个新控制器(也从 ParentViewController 中删除了 hybridPage),其中包含本机控制器和 HybridPage 控制器的相同实例(添加了两个控制器作为孩子)。

我的本​​机控制器大小为 (320,704),混合控制器大小为 (702,704)。

现在的问题是我无法从右侧与 Hybrid 控制器的半帧交互(距离视图的 contentoffset 结尾的 320 宽度)。

即使我无法与混合控制器的某些矩形进行交互,我也已经给出了两个 viewControllers 框架。

  • (void)setDashboardRootViewController:(UIViewController*)rootViewController

{

    if ([[self childViewControllers] containsObject:[MCIPadRootViewController getIPadRootViewController].mcWebViewController])

{

    [[MCIPadRootViewController getIPadRootViewController] removeMCWebViewController];

}

[self addChildViewController:self.dashboardViewController];

[self.dashboardContainerView addSubview:self.dashboardViewController.view];

if ([rootViewController isKindOfClass:[MCLoginFlowWebViewController class]])

{

    [self addChildViewController:[MCIPadRootViewController getIPadRootViewController].mcWebViewController];

    [MCIPadRootViewController getIPadRootViewController].mcWebViewController.view.frame = CGRectMake(0, 0, self.mcWebViewContainerView.frame.size.width, self.mcWebViewContainerView.frame.size.height);

    [self.mcWebViewContainerView addSubview:[MCIPadRootViewController getIPadRootViewController].mcWebViewController.view];

}

}

在哪里可以设置子 ViewController 的框架。在这里,我已经设置了 viewcontroller 的视图框架,但它没有影响。 谁能帮我摆脱这个问题。

为了清楚起见,请找到屏幕截图。

【问题讨论】:

    标签: ios objective-c ipad cordova uiviewcontroller


    【解决方案1】:

    您通常会在 2 个位置设置子视图控制器视图的框架。

    1. 就在您将其添加到父级之前。在父视图控制器中搜索对 addChildViewController: 的调用。在调用之前设置框架(可能有 2 次调用 addChildViewController:)。
    2. 如果尺寸因旋转而改变,您需要在父视图控制器的 viewWillLayoutSubviews: 方法中重置子视图控制器的视图框架。

    这是一个来自自定义拆分视图控制器的示例。

    注意设置 #1 的 2 个位置。

    - (void)setMasterViewController:(UIViewController *)controller
    {
        if (!_masterViewController) {
            // Add the new controller
            controller.view.frame = self.masterView.bounds;
            [self addChildViewController:controller];
            [self.masterView addSubview:controller.view];
            [controller didMoveToParentViewController:self];
            _masterViewController = controller;
        } 
        else if (_masterViewController != controller) {
            // Transition from the old to new controller
            controller.view.frame = self.masterView.bounds;
            [_masterViewController willMoveToParentViewController:nil];
            [self addChildViewController:controller];
            self.view.userInteractionEnabled = NO;
            [self transitionFromViewController:_masterViewController 
                              toViewController:controller 
                                      duration:0.0
                                       options:UIViewAnimationOptionTransitionNone
                                    animations:^{} 
                                    completion:^(BOOL finished) {
                                        self.view.userInteractionEnabled = YES;
                                        [_masterViewController removeFromParentViewController];
                                        [controller didMoveToParentViewController:self];
                                        _masterViewController = controller;
                                    }
             ];
    
        } 
    }
    

    这里是设置 #2 的地方:

    - (void)viewWillLayoutSubviews
    {
        CGRect contentFrame = self.view.bounds;
        float contentWidth = contentFrame.size.width;
    
        CGRect masterRect = contentFrame;
        CGRect detailRect = contentFrame;
        CGRect dividerRect = contentFrame;
    
        if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
            masterRect.size.width = DEFAULT_SPLIT_POSITION;
            detailRect.origin.x = DEFAULT_SPLIT_POSITION + DEFAULT_DIVIDER_WIDTH;
            detailRect.size.width = contentWidth - (DEFAULT_SPLIT_POSITION + DEFAULT_DIVIDER_WIDTH);
            dividerRect.size.width = DEFAULT_DIVIDER_WIDTH;
            dividerRect.origin.x = DEFAULT_SPLIT_POSITION;
        }
        else {
            masterRect.size.width = contentWidth;
            detailRect.origin.x = contentWidth;
            dividerRect.origin.x = contentWidth;
        }
    
        self.masterView.frame = masterRect;
        self.detailView.frame = detailRect;
        self.dividerView.frame = dividerRect;
    }
    

    [已编辑]

    那么您能否使用以下代码更新您的代码,以便您调用所有视图容器包含方法,并以正确的顺序使用和调用。

    [MCIPadRootViewController getIPadRootViewController].mcWebViewController.view.frame = CGRectMake(0, 0, self.mcWebViewContainerView.frame.size.width, self.mcWebViewContainerView.frame.size.height);
    [self addChildViewController:[MCIPadRootViewController getIPadRootViewController].mcWebViewController];
    [self.mcWebViewContainerView addSubview:[MCIPadRootViewController getIPadRootViewController].mcWebViewController.view];
    [controller didMoveToParentViewController:self];
    

    我也不认为你的 CGRectMake 是正确的。您通常不会引用视图的框架,而是引用父视图的边界。尝试像这样设置它,看看它是否有帮助。这将使它填充父视图,但您也可以对其进行调整。

    [MCIPadRootViewController getIPadRootViewController].mcWebViewController.view.frame = self.mcWebViewContainerView.bounds;
    

    【讨论】:

    • 感谢您的帮助杰西,但我的问题仍然没有解决。另外,我刚刚添加了一个屏幕截图,以便您了解我的问题。在调试时我只是发现了方向问题,即 DetailView (Hybrid) 框架是横向 (1024,768) 而 MasterView 是纵向 (768,1024)。
    • 添加子视图控制器时需要执行更多步骤。那可能是你的问题。我看到你只是在调用 addChildViewController:。光靠这还不够。阅读 UIViewController 文档的“实现容器视图控制器”部分。对于需要调用的其他方法,您可以参考我的代码示例 #1。
    • 首先我的应用程序有一个混合页面(登录),它具有全帧大小(1024、768),然后在混合页面之后,我在仪表板视图中使用相同的混合页面实例,它同时具有本机和混合页面。而且我的应用程序不支持肖像。感谢您的宝贵建议杰西
    • 这个问题是由于这个stackoverflow.com/questions/21038653/…问题引起的
    【解决方案2】:

    我想出了自己的解决方案。

    问题是我的应用程序以横向模式打开所以我将我的视图框架转换为边界。

    [[[self recurringListController] view] setFrame:[[self view] bounds]];
    

    使用上述方法,我克服了我的问题。

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多