bounty将在5天内到期。此问题的答案有资格获得+500声望奖励。Fattie希望引起更多关注这个问题。
我有一个UIView
子类,其中包含一个多行UILabel
。此视图使用自动布局。
我想将这个视图设置为UITableView
的tableHeaderView
(* 不是 * 一个节头)。此标题的高度将取决于标签的文本,而标签的文本又取决于设备的宽度。这种场景自动布局应该是很棒的。
我已经找到并尝试manymanysolutions让这个工作,但无济于事。我试过的一些方法:
- 在
layoutSubviews
期间,在每个标签上设置preferredMaxLayoutWidth
- 定义
intrinsicContentSize
- 试图弄清楚视图所需的大小,并手动设置
tableHeaderView
的帧。 - 在设置页眉时向视图添加宽度约束
- 一堆其他的东西
以下是我遇到的各种失败:
- 标签延伸超出视图宽度,不换行
- 框架高度为0
- 应用程序崩溃,异常
Auto Layout still required after executing -layoutSubviews
解决方案(或多个解决方案,如有必要)应适用于iOS 7和iOS 8。请注意,所有这些都是以编程方式完成的。我已经设置了一个small sample project,以防你想破解它来查看问题。我已经将我的努力重新设置为以下起点:
SCAMessageView *header = [[SCAMessageView alloc] init];
header.titleLabel.text = @"Warning";
header.subtitleLabel.text = @"This is a message with enough text to span multiple lines. This text is set at runtime and might be short or long.";
self.tableView.tableHeaderView = header;
我错过了什么?
9条答案
按热度按时间x759pob21#
到目前为止,我自己最好的答案是设置
tableHeaderView
一次,然后强制执行布局。这允许测量所需的大小,然后使用该大小设置头部的帧。而且,和tableHeaderView
s一样,我必须再次设置它第二次以应用更改。对于多行标签,这也依赖于自定义视图(本例中的消息视图)设置每个标签的
preferredMaxLayoutWidth
:2015年1月更新
不幸的是,这似乎仍然是必要的。以下是布局过程的Swift版本:
我发现在UITableView上将其移动到扩展中非常有用:
用途:
7rfyedvj2#
对于任何仍在寻找解决方案的人来说,这是针对Swift 3和iOS 9+的。这里有一个只使用AutoLayout的。它还在设备旋转时正确更新。
使用方法:
tableView
管理tableHeaderView
的框架,就像表格视图单元格一样。这是通过tableView
的beginUpdates/endUpdates
完成的。问题是
tableView
在更新子帧时并不关心AutoLayout。它使用 * current *tableHeaderView
的 * size * 来确定第一个单元格/节标题应该在哪里。1)添加一个宽度约束,以便每当我们调用layoutIfNeeded()时,
tableHeaderView
都使用此宽度。另外,添加centerX和top约束,以相对于tableView
正确定位。2)为了让
tableView
知道tableHeaderView
的最新大小,例如,当设备旋转时,我们可以在viewDidLayoutSubviews中调用tableHeaderView
的layoutIfNeeded()。然后,如果大小改变了,请调用beginUpdates/endUpdates。Check out a sample project
q9rjltbz3#
以下
UITableView
扩展解决了tableHeaderView
的自动布局和定位的所有常见问题,而无需使用帧:解释“奇怪”的步骤:
1.首先,我们将headerView宽度与tableView宽度绑定:它有助于旋转不足,并防止headerView的X中心子视图的深度左移。
1.(魔法!)* )我们在headerView中插入假layoutView:此时,我们强烈需要删除所有headerView约束,将layoutView展开为headerView,然后恢复初始headerView约束。* 约束的顺序有一定的意义!* 在我们得到正确的headerView高度自动计算的方式,也正确
所有headerView子视图的X集中化。
1.然后我们只需要重新布局headerView就可以得到正确的tableView
高度计算和页眉查看在截面上方的定位,不相交。
qlzsbp2j4#
这里的一些答案帮助我非常接近我需要的东西。但是,当在纵向和横向之间来回旋转设备时,我遇到了与系统设置的约束“UIView-Encapsulated-Layout-Width”冲突。我下面的解决方案主要基于marcoarment的这个要点(归功于他):https://gist.github.com/marcoarment/1105553afba6b4900c10。该解决方案不依赖于包含UILabel的头视图。有3个部分:
1.在UITableView的扩展中定义的函数。
1.从视图控制器的viewWillAppear()调用函数。
1.从视图控制器的viewWillTransition()调用该函数以处理设备旋转。
UITableView扩展
UITableViewController使用
zxlwwiss5#
对于使用AutoLayout的UITableView的headerView或footerView,这应该可以做到。
hec6srdp6#
在Swift 3.0中使用扩展
u2nhd7ah7#
其实就是这么简单:
序言。请注意,
tableFooterView
和tableHeaderView
绝对***与表视图中的 * 节 * 页脚/表头无关。它们在任何方面都不相似、相关或关联***。此外,在UIKit中,“表”和“节”装饰的范式、处理和视图循环处理完全不同,因此整个问题完全混乱。再加上这里在“2”中解释的完全奇怪的问题(这完全不同于UIKit中的任何其他约束处理),人们可以看到关于表尾的大量混乱是如何出现的。
压倒性的秘密是这样的:
1. xib的垂直优先级必须<1000。
在xib文件中,垂直约束链必须小于1000。这就是全部。以通常的方式加载xib文件。
这是让表格页眉/页脚工作的压倒性“秘密”。
2.由于Apple问题,您必须“重置”tableFooterView。事情就是这样试图解决这个苹果问题是完全没有意义的。
你会期望代码看起来像这样
简单的事实是你不能这样做,你必须这样做:
讨论这是一个苹果错误,软错误,愚蠢,奇怪的行为,错误,或任何其他完全没有意义。事实上,您必须“重置”tableFooterView。
(In你的代码,只需尝试另一种方式,你会发现,一开始页脚只是“浮动在屏幕中间”。在视图周期中的哪个地方尝试绝对没有区别,浪费时间来尝试,如你所愿!这只是一个典型的UIKit f 'up。
3.注意网上看到的 * 不正确 * 查看周期示例代码。
你在
viewWillLayoutSubviews
而不是***周期的后期执行。你***不要“检查高度是否改变”,就像在网上的许多例子中看到的。这显然是令人难以置信的毫无意义/非常糟糕的做法,原因不值得在这里。
为了清楚起见,如果它是一个简单的静态视图,你可以这样做以避免输入“viewDidLoad”:
4、复核点(1)。
或者,简单地说,什么都不起作用(您将在控制台中得到错误垃圾邮件)。
csga3l588#
你的限制有点偏离了。看看这个,如果你有什么问题告诉我。出于某种原因,我很难让背景的视图保持红色?因此,我创建了一个填充视图,该视图填充了
titleLabel
和subtitleLabel
的高度大于imageView
的高度而产生差距6rvt4ljy9#
我会加上我的2美分,因为这个问题是高度索引在谷歌。我觉得你应该用
你的
ViewDidLoad
此外,要将自定义UIView
加载到Header
中,实际上应该使用viewForHeaderInSection
委托方法。你可以有一个自定义的Nib
文件作为你的头(UIView
笔尖)。该Nib
必须有一个控制器类,该控制器类子类UITableViewHeaderFooterView
,如-请确保您的Nib文件名与类名相同,这样您就不会感到困惑,并且更容易管理。例如
YourCustomHeader.xib
和YourCustomHeader.swift
(包含class YourCustomHeader
)。然后,只需在界面构建器中使用身份检查器将YourCustomHeader
分配给您的Nib文件。然后在主视图控制器的
viewDidLoad
中注册Nib
文件作为头视图-然后在
heightForHeaderInSection
中返回UITableViewAutomaticDimension
。代表们应该是这样的-这是一个更简单和适当的方式,没有“黑客”的方式建议在接受的答案,因为多个强制布局可能会影响您的应用程序的性能,特别是如果你有多个自定义头在您的tableview。一旦你按照我的建议执行了上面的方法,你会注意到你的
Header
(和/或Footer
)视图会根据你的自定义视图的内容大小神奇地展开和收缩(假设你在自定义视图中使用AutoLayout,即YourCustomHeader
,nib文件)。