设置edgesForExtendedLayout会影响其父ViewController

时间:2016-04-25 18:38:14

标签: ios swift

在我的导航堆栈的孩子中,我设置了nextCallback(null, itemResult);

当我点击后退按钮时,我父母的UITableView会向上移动"就好像导航栏不存在一样。 (导航栏覆盖了表格)。

为什么孩子的边缘设置会影响其父级?我只希望它影响当前的viewController。

在我的父母中,这就是我创建UITableView的方式:

edgesForExtendedLayout = .None

可能是因为我错误地设置了tableView的框架吗?我希望表格从导航栏下方开始,但在标签栏之前结束。

1 个答案:

答案 0 :(得分:3)

听起来这可能是正确的行为,但与您期望的相反。

edgesForExtendedLayout = .None表示视图控制器的视图将扩展到顶部导航栏或底部标签栏下方。您说您的子视图控制器设置为edgesForExtendedLayout = .None但不是父视图控制器。当您返回到父视图控制器时,表视图会在导航栏下移动。如果您未将示例中的视图控制器设置为edgesForExtendedLayout = .None,则它仍将使用默认值edgesForExtendedLayout = .All。这将扩展顶部和底部栏下的表格视图的顶部。

对于您要查找的行为,请尝试使用表视图在父视图控制器上设置edgesForExtendedLayout = .None。因此,您的父视图控制器代码可能如下所示:

self.edgesForExtendedLayout = .None

self.tableView.delegate = self
self.tableView.dataSource = self

self.tableView.frame = CGRectMake(0, 0, screenWidth, screenHeight - self.navigationController!.navigationBar.bounds.height - self.tabBarController!.tabBar.bounds.height)

更新 - 要使用自动布局(优先于手动框架)实现相同的结果,首先要确保已将表格视图添加为视图控制器主视图的子视图,然后您可以简单地设置约束如下:

tableView.topAnchor.constraintEqualToAnchor(view.topAnchor).active = true
tableView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor).active = true
tableView.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor).active = true
tableView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor).active = true

使用这些NSLayoutAnchor便捷方法假设iOS 9或更高版本。当然,更简单的方法是在Storyboard中创建视图控制器,然后按住Ctrl并拖动约束。无论哪种方式,约束是否强制导航栏和标签栏下的表视图仍将由视图控制器的edgesForExtendedLayout属性控制。在故事板中,您可以通过在视图控制器的检查器中选中这些不同的框来控制这些设置:

storyboard inspector