table 视图单元格的自动大小似乎在标准 UIViewController class 中不起作用
Auto size of table view cell does not appear to work in a standard UIViewController class
为了验证这个问题,我创建了一个测试项目。在项目故事板中,我有两个场景。一个场景基于创建项目时添加到单视图应用程序的初始 ViewController
。第二个场景是通过将 UITableViewController
拖到故事板上创建的。
在这两个场景中,我相信我已经配置了原型单元格,因此它应该自动调整大小。当我将初始 ViewController
设置为基于 UIViewController 的 UITableViewCell
时,UITableViewCell
无法正确显示/调整大小。 (见下文)
然而,当我将初始 ViewController
设置为基于 UITableViewController
的那个时,一切正常。 (见下文)
代码/项目非常简单,我希望有人看到了这个并能告诉我为什么 UITableViewCell
的自动大小无法正常工作,而 class 基于 UIViewController
节 a UITableViewController
。任何帮助将不胜感激。看来我无法在此处上传项目,因此我将尝试将其上传到另一个位置并使用 link.
更新问题
回答标准问题
- 两个原型单元格中都有两个
UILabel
- 第一个
UILabel
指定了左、上、右和下约束。
- 第二个
UILabel
指定了左、右和下约束。
- 两个 classes 都将 estimatedRowHeight 设置为一个数字,将 rowHeight 设置为
UITableViewAutomaticDimension
- 所有
UILabel
行 属性 设置为 0
- 两个场景中的第一个
UILabel
的换行符设置为自动换行
- 两个场景中的第二个
UILabel
的换行符设置为截尾。
下面是界面生成器中场景的屏幕截图。左侧基于 UIViewController
,右侧基于 UITableViewController
这是我希望的代码link:Sample Project
对我来说很管用
- 给出上
UILabel
(右、上、左)约束
- 给出较低的
UILabel
(右、上、左、下)约束
自定义 UITableViewcell
override func awakeFromNib() {
super.awakeFromNib()
up.lineBreakMode = NSLineBreakMode.ByWordWrapping // Label outlet
down.lineBreakMode = NSLineBreakMode.ByWordWrapping // Label outlet
up.numberOfLines = 0
down.numberOfLines = 0
// Initialization code
}
编辑
在UITableViewController
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
在UIViewController
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
所以我发现 "silver bullet" 似乎解决了大量关于原型单元格自动布局的挑战。
在 cellForRowAtIndexPath 函数中,我在 return 单元格之前添加了以下代码行:
lobj_NearbyLocationEntry!.layoutIfNeeded()
(lobj_NearbyLocationEntry 是我正在 returning 的单元格变量的名称。)
当我这样做时,table 的自动布局工作正常。另外,我发现在使用 UITableViewController 的代码中也存在缺陷。一旦数据加载并且一切看起来都不错,如果您向下滚动然后向上滚动,您将看到几个单元格现在布局不正确。将这行代码放在那个视图控制器的代码中也解决了那个布局问题。
我希望这能帮助很多坐在那里试图弄清楚为什么他们的应用程序不能正确自动布局 tableView 单元格的人。 :)
为了验证这个问题,我创建了一个测试项目。在项目故事板中,我有两个场景。一个场景基于创建项目时添加到单视图应用程序的初始 ViewController
。第二个场景是通过将 UITableViewController
拖到故事板上创建的。
在这两个场景中,我相信我已经配置了原型单元格,因此它应该自动调整大小。当我将初始 ViewController
设置为基于 UIViewController 的 UITableViewCell
时,UITableViewCell
无法正确显示/调整大小。 (见下文)
然而,当我将初始 ViewController
设置为基于 UITableViewController
的那个时,一切正常。 (见下文)
代码/项目非常简单,我希望有人看到了这个并能告诉我为什么 UITableViewCell
的自动大小无法正常工作,而 class 基于 UIViewController
节 a UITableViewController
。任何帮助将不胜感激。看来我无法在此处上传项目,因此我将尝试将其上传到另一个位置并使用 link.
回答标准问题
- 两个原型单元格中都有两个
UILabel
- 第一个
UILabel
指定了左、上、右和下约束。 - 第二个
UILabel
指定了左、右和下约束。 - 两个 classes 都将 estimatedRowHeight 设置为一个数字,将 rowHeight 设置为
UITableViewAutomaticDimension
- 所有
UILabel
行 属性 设置为 0 - 两个场景中的第一个
UILabel
的换行符设置为自动换行 - 两个场景中的第二个
UILabel
的换行符设置为截尾。
- 第一个
下面是界面生成器中场景的屏幕截图。左侧基于 UIViewController
,右侧基于 UITableViewController
这是我希望的代码link:Sample Project
对我来说很管用
- 给出上
UILabel
(右、上、左)约束 - 给出较低的
UILabel
(右、上、左、下)约束
自定义 UITableViewcell
override func awakeFromNib() {
super.awakeFromNib()
up.lineBreakMode = NSLineBreakMode.ByWordWrapping // Label outlet
down.lineBreakMode = NSLineBreakMode.ByWordWrapping // Label outlet
up.numberOfLines = 0
down.numberOfLines = 0
// Initialization code
}
编辑
在UITableViewController
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
在UIViewController
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
所以我发现 "silver bullet" 似乎解决了大量关于原型单元格自动布局的挑战。
在 cellForRowAtIndexPath 函数中,我在 return 单元格之前添加了以下代码行:
lobj_NearbyLocationEntry!.layoutIfNeeded()
(lobj_NearbyLocationEntry 是我正在 returning 的单元格变量的名称。)
当我这样做时,table 的自动布局工作正常。另外,我发现在使用 UITableViewController 的代码中也存在缺陷。一旦数据加载并且一切看起来都不错,如果您向下滚动然后向上滚动,您将看到几个单元格现在布局不正确。将这行代码放在那个视图控制器的代码中也解决了那个布局问题。
我希望这能帮助很多坐在那里试图弄清楚为什么他们的应用程序不能正确自动布局 tableView 单元格的人。 :)