【问题标题】:UIViewController's view has weird 20px y marginUIViewController 视图有奇怪的 20px y 边距
【发布时间】:2016-05-09 19:20:11
【问题描述】:

我正在将 UIViewController 的视图添加到另一个 UIViewController 的视图中(使用新的 UIViewController 包含 API)。将 vc 的视图添加为另一个 subivew 后,顶部有一个奇怪的 20px 边距。

我记录了视图,它的来源是 0,0。但是,当我记录视图的超级视图时,它是:

<UIViewControllerWrapperView: 0x6c5e2c0; frame = (0 20; 703 748); autoresize = RM+BM; layer = <CALayer: 0x6c54190>>

我显然可以将它的帧更改为 0,0。但我想知道这样做的正确方法是什么?为什么vc的view的superview的frame是0,20?我应该修改这个还是有更好的方法来绕过这个奇怪的边距?

谢谢

【问题讨论】:

  • iOS 6 仍处于保密协议下,但我猜它与状态栏有关。
  • iOS 6 与此有什么关系?包含 API 来自 iOS 5。我说新是因为它们相对较新。
  • 我的错,我认为容器 API 是指 Xcode 4.5 的视图控制器容器(因为你提到它是新的),但 UIViewController 容器 API 是在 iOS 5 中引入的。

标签: objective-c ios cocoa-touch


【解决方案1】:

要解决这个问题,只需在情节提要上check the box "Wants Full Screen"

问题出现是因为 ParentViewController 正在显示导航栏。

正如苹果文档所说:

如果您的应用显示状态栏,则视图会缩小,使其不会与状态栏重叠。毕竟,如果状态栏是不透明的,则无法查看位于其下方的内容或与之交互。但是,如果您的应用显示半透明状态栏,您可以将视图控制器的 WantFullScreenLayout 属性的值设置为 YES 以允许您的视图全屏显示。状态栏绘制在视图的顶部。

【讨论】:

    【解决方案2】:

    找出问题所在。需要调用 addChildViewController: on self.因此,以下是您需要进行的调用顺序,以使收容措施正常工作:

    [self addChildViewController:navVC];
    [navVC didMoveToParentViewController:self];
    [mainView addSubview:navVC.view];
    

    self 是父视图控制器。 navVC 是您要添加的子视图控制器。 mainView 是父视图控制器中的视图,您将向其中添加子视图控制器的视图。

    【讨论】:

    • 今天遇到了同样的问题,navVC.wantsFullScreenLayout = YES;帮助了我。
    • 你救了我的命
    • 拥有addChildViewController 以使您的视图控制器层次结构与您的视图层次结构保持同步很重要。如果你不这样做,你必须想出你自己对它的强引用,否则它不会被保留。此外,如果您的子视图控制器不在视图控制器层次结构中,则它不会获得某些事件。顺便说一句,在添加子视图之后,对 didMoveToParentViewController 的调用应该是您做的最后一件事。
    【解决方案3】:

    我更喜欢下面的代码,适合我。

        [self.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    

    【讨论】:

    • +1 虽然我将其表述为 self.pageController.view.frame = self.view.bounds;
    • 别忘了把它放在 -(void)viewDidAppear:(BOOL)animated {...}
    【解决方案4】:

    您需要在第一个视图控制器加载之前添加一行

    - (void) viewDidLoad 
    {
         self.automaticallyAdjustsScrollViewInsets = NO;
         [super viewDidLoad];
    }
    

    【讨论】:

      【解决方案5】:

      即使您尝试将状态栏下拉菜单设置为“无”,也要检查视图的大小属性。确保它仍然没有硬编码的高度值 460,或 20 的 y 原点(在 Xcode 的图形设计器中)。如果您希望此视图填充其整个父视图,请确保在属性中设置自动调整大小蒙版以固定到所有侧面(顶部、左侧、底部、右侧),并且可能也设置为拉伸。

      仅查看您的调试输出,似乎自动调整大小属性可能仅设置为 UIViewAutoresizingFlexibleBottomMarginUIViewAutoresizingFlexibleRightMargin

      最后,包含视图可能需要选中其 Autoresize Subviews 复选框。

      【讨论】:

      • Autoresize subviews 检查包含视图。视图在 IB 中的原点显示为灰色,但显示值为 x:0 y:0。我尝试在所有方面添加灵活的边距。没有运气。
      • @0xSina,您的应用的 Info.plist 文件中是否指定了状态栏样式?
      • 不,我没有设置任何具体的内容,这是默认的 plist。我没有碰 info.plist
      【解决方案6】:

      看看 WantsFullScreenLayout 属性。如果设置为 YES,视图将延伸到 UIStatusBar 下方。

      【讨论】:

        【解决方案7】:

        我遇到了同样的问题,但我在 IOS 9 中通过使用约束(在界面生成器中)解决了它。我没有使用全屏,因为它已被弃用。 添加一个leading 和一个 trailingMargin 约束并给他们常量 -20

        【讨论】:

          【解决方案8】:

          虽然我没有使用包含 API 的经验,但我通过在 Identity Inspector 中将状态栏设置为“无”(见下文)解决了许多“20 岁以下”问题。

          【讨论】:

          • 嗨,斯科特,感谢您的意见。我试过了,在 Interface Builder 中将状态栏设置为 none,但仍然没有运气。我什至尝试在没有 nib 的情况下实例化视图控制器,同样的事情。
          • 如所说,只是模拟的。
          【解决方案9】:

          只需使用这个视口元标记。

          <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
          

          把“height=device-height”放在那里会导致这个问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-04-27
            • 2020-07-08
            • 2021-12-02
            • 1970-01-01
            • 2011-10-11
            • 2011-04-29
            • 2014-02-10
            相关资源
            最近更新 更多