UITableView 重新加载行在 iOS 11.2 中不自然地抽动 TableView
UITableView Reload Rows unnaturally jerking the TableView in iOS 11.2
通过调用
将新的 XCODE 9.2 更新为 iOS 11.2 后出现了奇怪的问题
let indexPath = IndexPath(item: 0, section: 1)
self.tableViewHome.reloadRows(at: [indexPath], with: .none)
它会导致整个 TableView 不必要的颠簸,之前这些代码很好。
iOS11.2
的 GIF 图片
iOS11.1
的 GIF 图片
如何停止这种抽搐,我必须在两个单元格中重新加载表格视图中的一个单元格。
任何帮助将不胜感激。
谢谢
终于找到了答案,我必须使用 UITableView 的委托方法,即
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
通过返回 UITableViewAutomaticDimension
放置此方法后,它会停止 iOS 11.2.
的抽搐
** 对于 ios 11.2.* **
tableView.rowHeight = viewDidLoad()
中的 UITableViewAutomaticDimension
添加estimatedHeightForRowAt
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.row == 0{
return firstCellHeight()
}
else{
return UITableViewAutomaticDimension
}
}
firstCellHeight
是我的第一个单元格高度
func firstCellHeight() -> CGFloat{
if UIDevice.Display.typeIsLike == UIDevice.DisplayType.ipad{
return 400
}else if UIDevice.Display.typeIsLike == UIDevice.DisplayType.iphone7plus{
return 230
}else if UIDevice.Display.typeIsLike == UIDevice.DisplayType.iphoneX{
return 200
}else{
return 180
}
}
和不要使用:reloadRows
let indexPath = IndexPath(item: 1, section: 0)
tableView.reloadRows(at: [indexPath], with: .none)
而是使用 reloadData
即 tableView.reloadData()
最后,在需要执行操作的地方,使用以下代码:
let indexPath0 = IndexPath(item: 0, section: 0)
if !((tableView.indexPathsForVisibleRows?.contains(indexPath0))!) {
print("Not Visible")
self.tableView.setContentOffset(CGPoint(x:0, y:firstCellHeight() ), animated: false)
}
我的理解是,如果您真的想使用自动调整单元格大小(并且所有单元格的大小都不同),那么上述解决方案不适用于 iOS 11.2,所以我尝试的方法如下:
声明变量来存储单元格的高度
var cellHeightDictionary: NSMutableDictionary // To overcome the issue of iOS11.2
在viewDidLoad中初始化,
override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 125
cellHeightDictionary = NSMutableDictionary()
}
并像下面这样使用:
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cellHeightDictionary.setObject(cell.frame.size.height, forKey: indexPath as NSCopying)
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
if cellHeightDictionary.object(forKey: indexPath) != nil {
let height = cellHeightDictionary.object(forKey: indexPath) as! CGFloat
return height
}
return UITableViewAutomaticDimension
}
这对我有用,希望对你也有帮助
我有同样的问题。我做错了一件事。
选择了 Storyboard 中的自动行高和自动估计高度,并在代码中实现了 heightForRowAt 方法。我取消选中自动行高,只实现了 heightForRowAt 方法。它解决了我的问题。
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{
return 390
}
通过调用
将新的 XCODE 9.2 更新为 iOS 11.2 后出现了奇怪的问题let indexPath = IndexPath(item: 0, section: 1)
self.tableViewHome.reloadRows(at: [indexPath], with: .none)
它会导致整个 TableView 不必要的颠簸,之前这些代码很好。
iOS11.2
的 GIF 图片iOS11.1
的 GIF 图片如何停止这种抽搐,我必须在两个单元格中重新加载表格视图中的一个单元格。
任何帮助将不胜感激。
谢谢
终于找到了答案,我必须使用 UITableView 的委托方法,即
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
通过返回 UITableViewAutomaticDimension
放置此方法后,它会停止 iOS 11.2.
** 对于 ios 11.2.* **
tableView.rowHeight = viewDidLoad()
添加estimatedHeightForRowAt
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.row == 0{
return firstCellHeight()
}
else{
return UITableViewAutomaticDimension
}
}
firstCellHeight
是我的第一个单元格高度
func firstCellHeight() -> CGFloat{
if UIDevice.Display.typeIsLike == UIDevice.DisplayType.ipad{
return 400
}else if UIDevice.Display.typeIsLike == UIDevice.DisplayType.iphone7plus{
return 230
}else if UIDevice.Display.typeIsLike == UIDevice.DisplayType.iphoneX{
return 200
}else{
return 180
}
}
和不要使用:reloadRows
let indexPath = IndexPath(item: 1, section: 0)
tableView.reloadRows(at: [indexPath], with: .none)
而是使用 reloadData
即 tableView.reloadData()
最后,在需要执行操作的地方,使用以下代码:
let indexPath0 = IndexPath(item: 0, section: 0)
if !((tableView.indexPathsForVisibleRows?.contains(indexPath0))!) {
print("Not Visible")
self.tableView.setContentOffset(CGPoint(x:0, y:firstCellHeight() ), animated: false)
}
我的理解是,如果您真的想使用自动调整单元格大小(并且所有单元格的大小都不同),那么上述解决方案不适用于 iOS 11.2,所以我尝试的方法如下:
声明变量来存储单元格的高度
var cellHeightDictionary: NSMutableDictionary // To overcome the issue of iOS11.2
在viewDidLoad中初始化,
override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 125
cellHeightDictionary = NSMutableDictionary()
}
并像下面这样使用:
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cellHeightDictionary.setObject(cell.frame.size.height, forKey: indexPath as NSCopying)
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
if cellHeightDictionary.object(forKey: indexPath) != nil {
let height = cellHeightDictionary.object(forKey: indexPath) as! CGFloat
return height
}
return UITableViewAutomaticDimension
}
这对我有用,希望对你也有帮助
我有同样的问题。我做错了一件事。 选择了 Storyboard 中的自动行高和自动估计高度,并在代码中实现了 heightForRowAt 方法。我取消选中自动行高,只实现了 heightForRowAt 方法。它解决了我的问题。
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{
return 390
}