在 UIViewController 中使用 UITableViewController 以编程方式自动布局
Posted
技术标签:
【中文标题】在 UIViewController 中使用 UITableViewController 以编程方式自动布局【英文标题】:Programatically Autolayout with UITableViewController in a UIViewController 【发布时间】:2014-05-20 07:12:46 【问题描述】:对于我的简单问题,我已经把所有的自动布局问题都搞砸了:
我有一个 UIViewController 显示在 UINavigationController 中。那个 UIViewController 里面有一个 UITableViewController 。这是代码:
FirstViewController:
- (void)viewDidLoad
[super viewDidLoad];
UIView *contentView = [UIView new];
contentView.translatesAutoresizingMaskIntoConstraints = NO;
self.view = contentView;
[self.view setBackgroundColor:[UIColor redColor]];
firstTable=[[FirstTableViewController alloc] initWithStyle:UITableViewStylePlain];
[self.view addSubview:firstTable.tableView];
现在,当我运行时,我在 FirstViewController 的顶部和 tableViewController(其中没有位置代码)之间出现间隙。
SO 使用 viewDidLayoutSubviews 方法我尝试了各种约束
-(void) viewDidLayoutSubviews
[firstTable.tableView layoutIfNeeded];
//[firstTable.tableView pinEdge:NSLayoutAttributeTop toEdge:NSLayoutAttributeTop ofView:self.view inset:0.0];
// CRASHES
[firstTable.tableView addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0.0]];
// CRASHES: A constraint cannot be made that sets a location equal to a constant. Location attributes must be specified in pairs'
上面我尝试了几种不同的方法
我只想将tableView 的顶部与ViewController 的视图相匹配。设置框架的问题是我遇到了全屏视图(视频播放器)将这个差距拉回来的问题。
如何匹配这个 tableViewController 的顶部来消除这个差距?以编程方式,请不要使用使用 ios 7 自动布局功能的 IB!
解决方案
Sir Lord High Stack Master @jrturton 为我指出了我正在考虑的方向,一般来说,上面的结构是问题所在。我将尝试他的一般指示,但我认为这是一个结构性问题,并将委托和数据源功能从原始 VC 中移出,并将其带入 UITableViewController,这就是它的用途!
【问题讨论】:
【参考方案1】:-
在
viewDidLoad
中设置self.view
是……奇怪。在调用该方法时,self.view 已经设置好了。
视图控制器的主视图属性不需要对其自动调整大小掩码或其他任何操作进行任何操作。如果我手动构建视图,我通常只在loadView
中执行self.view = [UIView new];
。
如果要添加子视图控制器,请确保将其添加为子视图控制器,不要只添加视图
如果要使用自动布局来布局子视图控制器,则需要在子视图控制器的视图上将translatesAutoresizingMaskIntoConstraints
设置为NO
。
viewDidLayoutSubviews
不是创建约束的好地方。添加子视图时应添加固定约束,因此您可能应该在loadView
中执行所有操作 - 一旦您遵循上述建议,只需将表格视图固定到顶部、左侧和右侧边缘(并设置高度如果它没有一直向下,否则也固定到底部,但如果你这样做我不确定为什么它是一个子视图控制器)。
【讨论】:
谢谢伙计,不知道你在 3. 中的意思是什么?您的意思是仅实例化 VC 还是在该 VC 中添加该视图?由于删除了原始 VC 的视图功能,我有点脱离了上面的一般结构,所以我只是在 NavigationController 中显示 UITableViewController。 在 3 中,我的意思是你必须调用addChildViewController
和 addSubview
,这样才能正确传递轮换和其他事件。以上是关于在 UIViewController 中使用 UITableViewController 以编程方式自动布局的主要内容,如果未能解决你的问题,请参考以下文章
从 swiftUI 中的一个嵌入式 UIViewController 导航到 swift UI 中的另一个嵌入式 UIViewcontroller
为啥情节提要 ui 元素未显示在 xcode 9 中的 UIViewController 上
将 UIViewController 的 UI 扩展到子 UIViewControllers