以编程方式向 topLayoutGuide 添加约束?

Posted

技术标签:

【中文标题】以编程方式向 topLayoutGuide 添加约束?【英文标题】:Adding constraints programmatically to topLayoutGuide? 【发布时间】:2016-06-03 17:50:07 【问题描述】:

如果我在 viewController 的 viewDidLoad() 中将 UITableView 约束到它的超级视图,一切都会完美运行。

但是,如果我尝试像这样将 tableView 约束到 layoutGuide 的顶部:

 // tableView.top = view.top
myConstraint =[NSLayoutConstraint
               constraintWithItem:theTableView
               attribute:NSLayoutAttributeTop
               relatedBy:NSLayoutRelationEqual
               toItem:self.view
               attribute:NSLayoutAttributeTop
               multiplier:1.0
               constant:0];
myConstraint.identifier = @"tableView.top = layoutguide.bottom";
[self.view addConstraint:myConstraint];

我得到这个错误:

    [UIViewController topLayoutGuide]: guide not available before the view controller's view is loaded
2016-06-03 10:48:06.310 BlinkPDF[304:34590] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: A multiplier of 0 or a nil second item together with a location for the first attribute creates an illegal constraint of a location equal to a constant. Location attributes must be specified in pairs'

我尝试将我的所有约束移动到 viewController 的 -(void) updateConstraints 方法中,这消除了运行时错误并正确呈现了视图,但是,当我旋转设备时,视图没有正确更新。

谁能告诉我写那个约束的正确位置?

谢谢!

【问题讨论】:

【参考方案1】:
Try to call your updateConstraints to viewDidAppear and add this line before calling method 

    tableView.translatesAutoresizingMaskIntoConstraints = NO;

So your viewDidAppear method will be like

    - (void)viewDidAppear:(BOOL)animated
       [super viewDidAppear:animated];
       [self updateConstraints];
    

这会对你有所帮助。

【讨论】:

以上是关于以编程方式向 topLayoutGuide 添加约束?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式向已以编程方式添加到表格单元格的标签添加约束

如何以编程方式向以编程方式创建的 UIView 添加约束?

以编程方式向 UIView 添加约束

在 iOS 上以编程方式向按钮添加操作

Avalonia:如何以编程方式向 UserControl 添加控件

如何以编程方式向 UIStackView 添加安全区域布局?