调整视图大小以考虑工具栏

Posted

技术标签:

【中文标题】调整视图大小以考虑工具栏【英文标题】:Resize view to account for toolbar 【发布时间】:2016-11-21 09:32:07 【问题描述】:

如果我创建一个基本的 ViewController 并向视图添加一个不透明的 UIToolbar,如下所示:

UIViewController* viewController = [[UIViewController alloc] init];
[viewController.view setBackgroundColor:[UIColor blueColor]]; // To make it easy to see
self.window.rootViewController = viewController;

UIToolbar* toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, viewController.view.frame.size.height - 49, viewController.view.frame.size.width, 49)]; // At bottom. Height of 49
[toolbar setBarStyle:UIBarStyleBlack]; // Opaque and easy to see

[self.window.rootViewController.view addSubview:toolbar]; // Add toolbar to view controller

视图层次结构如下所示:

如何让视图控制器调整其主要区域(蓝色部分)的大小,使其不会延伸到 UIToolbar 后面?

【问题讨论】:

保持 viewController.view 不变,不设置颜色,为蓝色部分添加另一个 UIView 这是否与将另一个 ViewController 中的视图添加为子视图相同? @ABeard 没找到你 如果我有第二个视图控制器,名为secondVC,这就是您的建议吗? [viewController.view addSubview:secondVC.view]; 在这种情况下你可以使用容器,看看***.com/questions/16884879/… 【参考方案1】:

尝试添加这行代码

viewController.edgesForExtendedLayout = UIRectEdgeNone;

这将使视图控制器的边缘不会向任何方向延伸。

或者,如果您想扩展顶部、左侧和右侧,而不是底部,您可以添加它。

viewController.edgesForExtendedLayout =  UIRectEdgeTop, UIRectEdgeLeft, UIRectEdgeRight;

【讨论】:

这些都没有任何效果。【参考方案2】:

这样试试

UIViewController* viewController = [[UIViewController alloc] init];
    [viewController.view setBackgroundColor:[UIColor blueColor]]; // To make it easy to see
    self.window.rootViewController = viewController;

UIToolbar* toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, viewController.view.frame.size.height - 49, viewController.view.frame.size.width, 49)]; // At bottom. Height of 49
[toolbar setBarStyle:UIBarStyleBlack]; // Opaque and easy to see

SecondViewController* secondChildVC = [self.storyboard instantiateViewControllerWithIdentifier:@"someId"];
[secondChildVC.view setBackgroundColor:[UIColor redColor]];
[viewController addChildViewController:secondChildVC];
[secondChildVC didMoveToParentViewController:viewController];
secondChildVC.view.frame = CGRectMake(0,0,viewController.view.frame.size.width,viewController.view.frame.size.height - 49);
[viewController.view addSubview:secondChildVC.view];

[self.window.rootViewController.view addSubview:toolbar];

【讨论】:

是否需要计算第二个VC的帧数? secondChildVC.view.frame = CGRectMake(0,0,viewController.view.frame.size.width,viewController.view.frame.size.height - 49);这种计算正是我不想做的。 我希望主 VC 自动计算第二个 VC 的正确大小。有没有办法做到这一点? 换句话说,我需要主 VC 像 UITabBarController 或 UINavigationController 一样工作。这两个都会自动调整内容区域的大小,而无需自己计算。 如果不想计算frame,那么可以使用NSLayoutConstraints 我自己也开始这么想了。我正在尝试在此处遵循本指南:***.com/questions/31651022/…

以上是关于调整视图大小以考虑工具栏的主要内容,如果未能解决你的问题,请参考以下文章

模式视图在 ios 6.0 中调整大小,工具栏位于视图中间

使用 UINavigationController setToolbarHidden:animated 时如何调整视图大小:

viewDidLoad 中的边界和帧大小

如何在 Swift 的工具栏顶部居中分段控件?

调整 UITableViewCell 大小的 NSLayoutConstraint 错误

UIToolbar 的动画调整大小导致在 iOS <5.1 上剪切背景