在 UITableView 的标题视图上使用 NSLayoutConstraints

Posted

技术标签:

【中文标题】在 UITableView 的标题视图上使用 NSLayoutConstraints【英文标题】:Use NSLayoutConstraints on a UITableView's header view 【发布时间】:2012-10-08 15:39:14 【问题描述】:

我正在尝试将 UIView 添加到 UITableView 的标题中,然后使用 NSLayoutConstraints 我想给它一个高度。

我查看了 Apple Docs 和 WWDC 2012 视频,但在任何地方都找不到这个特定的错误!

我有以下代码:

- (UIImageView *)logoImageView

    if (!_logoImageView) 
        _logoImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo"]];
        [_logoImageView setTranslatesAutoresizingMaskIntoConstraints:NO];
    
    return _logoImageView;

...在 viewDidLoad

UIView *tableHeaderView = [[UIView alloc] init];
tableHeaderView.translatesAutoresizingMaskIntoConstraints = NO;

[tableHeaderView addSubview:self.logoImageView];

[self.tableView setTableHeaderView:tableHeaderView];

NSDictionary *constraintViews = @@"tableView" : self.tableView, @"tableHeaderView" : tableHeaderView, @"logoImageView" : self.logoImageView;

[self.tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tableHeaderView(50)]"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:constraintViews]];

但是当我运行它时,我收到以下错误:

2012-10-08 16:31:34.559 myApp[6934:c07] *** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776
2012-10-08 16:31:34.561 myApp[6934:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.'
*** First throw call stack:
(0x199b012 0x17c0e7e 0x199ae78 0x1256f35 0x7589ef 0x17d46b0 0x622fc0 0x61733c 0x622eaf 0x7f78cd 0x7401a6 0x73ecbf 0x73ebd9 0x73de34 0x73dc6e 0x73ea29 0x741922 0x7ebfec 0x738bc4 0x738dbf 0x738f55 0x741f67 0x705fcc 0x706fab 0x718315 0x71924b 0x70acf8 0x27e8df9 0x27e8ad0 0x1910bf5 0x1910962 0x1941bb6 0x1940f44 0x1940e1b 0x7067da 0x70865c 0x6d5d 0x2395)
libc++abi.dylib: terminate called throwing an exception

【问题讨论】:

请问您是否找到了解决此问题的方法? 【参考方案1】:

我在尝试设置表头视图时遇到了同样的异常。 当我注意到视图有约束时,我只是取消了情节提要中的“使用自动布局”选项。

截图:http://i.stack.imgur.com/5jWHy.png

这为我解决了。

【讨论】:

这只是解决问题,而不是解决问题:(你不能只关闭自动布局!【参考方案2】:

解决此问题的最佳方法是使用 Interface Builder 设置 UITableView 标头,然后将 Outlet 添加到高度 NSLayoutConstraint

【讨论】:

你能详细说明一下吗?不知道这意味着什么。 NSLayoutConstraints 是常规对象,因此您可以从 Interface Builder 为它们创建 outlet,并在运行时像处理 IB 视图一样操作它们的属性(例如) 我看不到在情节提要中向UITableView 的页眉或页脚添加高度或宽度布局约束的方法。 Add New Constraints 里面的东西都被屏蔽了。【参考方案3】:

试试这个:

logoImageView.translatesAutoresizingMaskIntoConstraints = YES;

(如果不起作用,请尝试删除:

tableHeaderView.translatesAutoresizingMaskIntoConstraints = NO;  //Remove this line

:)

【讨论】:

【参考方案4】:

我没有为这个问题找到任何合适的解决方案,但您可以通过使用框架来修复它,而不是将 translatesAutoresizingMaskIntoConstraints 属性设置为否(默认情况下是,所以不要设置它)

CGRect headerViewFrame = CGRectMake(0,0,320,60); //Frame for your header/footer view

UIView *tableHeaderView = [[UIView alloc] initWithFrame:headerViewFrame];
tableHeaderView.translatesAutoresizingMaskIntoConstraints = Yes; //Or don't set it at all
[self.tableView setTableHeaderView:tableHeaderView];

【讨论】:

以上是关于在 UITableView 的标题视图上使用 NSLayoutConstraints的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 中显示 Json 结果

在 UITableView 上添加子视图

全局设置按钮的背景颜色,除了 UITableView 中的辅助按钮

在约束上动画更改 UITableView 节标题的高度

UITableView

UITableview 单元格高度在 iOS 14.0 中的滚动表视图上发生变化