UITableViewCell 未在 "Live" 搜索中自动调整大小
UITableViewCell Not Autoresizing in "Live" Search
一点背景知识
我正在为我的应用程序中的某些公告制作搜索功能。我将初始公告加载到 UITableView
中,并带有要显示的自定义单元格。为了在 AnnouncementTableViewController
class 的 viewDidLoad()
方法中实现动态单元格大小,我使用了自动调整技术:
tableView.estimatedRowHeight = tableView.rowHeight
tableView.rowHeight = UITableViewAutomaticDimension
这非常适合显示具有不同高度的单元格。刷新单元格数据时调用 tableView.reloadData()
效果很好。
我有一个不同的 UITableView
,它最初显示空白表格视图,UISearchBar
作为 header。我实现了 UISearchBarDelegate
方法 searchBar(_:textDidChange:)
,执行我的搜索过滤逻辑并将过滤后的公告附加到 filteredAnnouncements
数组。
我在 didSet
中为 filteredAnnouncements
调用了 tableView.reloadData()
方法。
问题
当我在搜索栏中键入时,单元格不会自动调整自身大小,实际上它们是默认高度。我有一个标题和每个公告的 body,所以 body 被截断了。
我试过的
UITableAutomaticDimension
技巧似乎不适用于实时搜索(每次按键后更新)。我试过在 filteredAnnouncements
数组的 didSet
观察者中调用 tableView.setNeedsDisplay()
、tableView.setNeedsUpdatedConstraints
、tableView.setNeedsLayout()
。
我试图覆盖自定义单元格 class 中的 didMoveToSubview()
方法,以根据旧的 Whosebug 问题调用上面命名的那些不同方法,但都没有成功。
编辑:在下面回答了自己的问题
在 table 上调用 beginUpdates
和 endUpdates
将强制它重新计算所有行的高度。
我认为如果您实现 UITableView
的行 insertion/deletion 方法而不是使用 reloadData
,您会发现整个体验更容易(并且让您的用户更满意!) .
我正在覆盖 tableView(_:heightForRowAtIndexPath:)
并返回 tableView.estimatedRowHeight
。我将方法更改为:
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return tableView.estimatedRowHeight
}
一点背景知识
我正在为我的应用程序中的某些公告制作搜索功能。我将初始公告加载到 UITableView
中,并带有要显示的自定义单元格。为了在 AnnouncementTableViewController
class 的 viewDidLoad()
方法中实现动态单元格大小,我使用了自动调整技术:
tableView.estimatedRowHeight = tableView.rowHeight
tableView.rowHeight = UITableViewAutomaticDimension
这非常适合显示具有不同高度的单元格。刷新单元格数据时调用 tableView.reloadData()
效果很好。
我有一个不同的 UITableView
,它最初显示空白表格视图,UISearchBar
作为 header。我实现了 UISearchBarDelegate
方法 searchBar(_:textDidChange:)
,执行我的搜索过滤逻辑并将过滤后的公告附加到 filteredAnnouncements
数组。
我在 didSet
中为 filteredAnnouncements
调用了 tableView.reloadData()
方法。
问题
当我在搜索栏中键入时,单元格不会自动调整自身大小,实际上它们是默认高度。我有一个标题和每个公告的 body,所以 body 被截断了。
我试过的
UITableAutomaticDimension
技巧似乎不适用于实时搜索(每次按键后更新)。我试过在 filteredAnnouncements
数组的 didSet
观察者中调用 tableView.setNeedsDisplay()
、tableView.setNeedsUpdatedConstraints
、tableView.setNeedsLayout()
。
我试图覆盖自定义单元格 class 中的 didMoveToSubview()
方法,以根据旧的 Whosebug 问题调用上面命名的那些不同方法,但都没有成功。
编辑:在下面回答了自己的问题
在 table 上调用 beginUpdates
和 endUpdates
将强制它重新计算所有行的高度。
我认为如果您实现 UITableView
的行 insertion/deletion 方法而不是使用 reloadData
,您会发现整个体验更容易(并且让您的用户更满意!) .
我正在覆盖 tableView(_:heightForRowAtIndexPath:)
并返回 tableView.estimatedRowHeight
。我将方法更改为:
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return tableView.estimatedRowHeight
}