Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我可以让UIAbbarController调整其选项卡的大小吗';视图控制器是否根据其自身的布局指南(非IB)?_Ios_Swift_Cocoa Touch_Uikit_Uitabbarcontroller - Fatal编程技术网

Ios 我可以让UIAbbarController调整其选项卡的大小吗';视图控制器是否根据其自身的布局指南(非IB)?

Ios 我可以让UIAbbarController调整其选项卡的大小吗';视图控制器是否根据其自身的布局指南(非IB)?,ios,swift,cocoa-touch,uikit,uitabbarcontroller,Ios,Swift,Cocoa Touch,Uikit,Uitabbarcontroller,(注意:这个问题是关于在不使用界面生成器的情况下开发iOS的问题。) 苹果公司有一份声明说: 使用不透明UINavigationController或uitabarcontroller的应用程序会自动将其内容保持在状态栏下方 当我看到这一点时,我认为这意味着当作为整个应用程序的根视图控制器使用时,UITabBarController将自动调整其选项卡视图控制器的大小,以便它们不会扩展到状态栏下 但是,如果在AppDelegate中使用下面的代码创建一个空项目,则表明情况并非如此。状态栏下的区域以

(注意:这个问题是关于在不使用界面生成器的情况下开发iOS的问题。)

苹果公司有一份声明说:

使用不透明UINavigationController或uitabarcontroller的应用程序会自动将其内容保持在状态栏下方

当我看到这一点时,我认为这意味着当作为整个应用程序的根视图控制器使用时,UITabBarController将自动调整其选项卡视图控制器的大小,以便它们不会扩展到状态栏下

但是,如果在AppDelegate中使用下面的代码创建一个空项目,则表明情况并非如此。状态栏下的区域以红色或蓝色结束,这取决于您所在的选项卡,而不是作为基本窗口背景色的白色

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
    window = UIWindow(frame: UIScreen.mainScreen().bounds)

    let vc1 = UIViewController()
    vc1.view.backgroundColor = UIColor.redColor()
    vc1.tabBarItem = UITabBarItem(tabBarSystemItem: .Bookmarks, tag: 1)

    let vc2 = UIViewController()
    vc2.view.backgroundColor = UIColor.blueColor()
    vc2.tabBarItem = UITabBarItem(tabBarSystemItem: .Favorites, tag: 2)

    let tbc = UITabBarController()
    tbc.viewControllers = [vc1, vc2]

    window!.rootViewController = tbc
    window!.backgroundColor = UIColor.whiteColor()
    window!.makeKeyAndVisible()

    return true
}
UITabBarController有一个topLayoutGuide,我可以使用它添加显式约束,使内容保持在状态栏下方。大概涉及这些指南的东西(而不是硬编码某个地方的偏移量为20)将是“正确的方式”。然而,在我的现实生活中,vc1和vc2应该是UITableViewController,因此我能看到的唯一方法是:

  • 从UITabBarController派生并添加约束以管理其选项卡视图控制器的大小。当用户在选项卡之间切换时,可能需要添加/删除这些约束。听起来很复杂,我不确定它将如何与UITabBarController中的任何功能交互,将包含的视图设置为当前大小
  • 创建用于选项卡视图控制器的自定义视图控制器类,该类将UITableViewController作为子级包含,并将其视图约束在其自己的布局参考线(似乎已正确设置)内
  • 我倾向于2,但是视图控制器控制似乎需要做大量的工作来实现一些Q&A似乎暗示应该已经发生的事情。我对iOS/Cocoa/Swift/Xcode/EverythingApple还不熟悉,我相信一定有更好的方法

    更新:实际上,更仔细地观察模拟器,所包含的视图控制器似乎也延伸到选项卡栏后面。一定有一些很基本的东西我在这里出错了

    更新:edgesForExtendedLayout看起来很有希望,但将其设置为UIDirectEdge。在我的测试中,似乎没有人会停止状态栏下的视图扩展

    更新:实际上,将edgesForExtendedLayout设置为UIRECTDEDGE。在上述示例中,vc1和vc2上的任何一个都不会阻止视图在选项卡栏下扩展,这是一个正确的步骤。但是,它对状态栏没有影响。关于这个问题的文件真是太糟糕了。我不明白你该如何判断“扩展布局”是什么意思,或者edgesForExtendedLayout和topLayoutGuide/bottomLayoutGuide之间的关系是什么,除了尝试和错误,这似乎是人们一直在求助的方法


    更新:这比文档提供了更多的细节,并解释了我看到的行为。然而,我仍然没有看到一个好的解决方案。我不能插入最外层的视图控制器来保存所有内容,因为UITabBarController的文档中说,您不应该将其作为另一个视图控制器的子视图-它需要是根视图控制器。我怀疑博客第8点中描述的contentInset行为是为了给我真正需要的东西,即UITableView内容的顶部从状态栏下方开始。如果苹果想让我允许内容在状态栏下滚动,我想这没问题。然而,目前我的表格视图的顶部是从状态栏文本开始的,这显然是错误的。可能是什么原因阻止了contentInset调整的工作。

    我将其放在viewDidLoad方法中,以防止UITAbleView内容加载到选项卡栏下方。在我的例子中,选项卡栏位于顶部,我必须迭代以找到偏移量:

    self.tableView.contentInset=UIEdgeInsetsMake(70,0,0,0)

    一般用例是:


    self.tableView.contentInset=UIEdgeInsetsMake(,)

    感谢您的回复,但这对我来说似乎是一种攻击。我觉得我不应该硬编码系统代表我设置的标签栏大小之类的东西——这似乎不适合未来。由于您的问题是选项卡栏而不是状态栏,因此使用我在上两次更新中提到的edgesForExtendedLayout属性可能可以更好地解决问题。