ios 11 UITableViewHeaderFooterView 无法正确滚动动画
Posted
技术标签:
【中文标题】ios 11 UITableViewHeaderFooterView 无法正确滚动动画【英文标题】:ios 11 UITableViewHeaderFooterView not properly scroll in animation 【发布时间】:2017-12-21 12:36:50 【问题描述】:我在 UITableView 中有折叠和展开动画。 Tableview 有两个部分,其中第一部分数据是折叠和展开。这个东西与 ios 10 完美配合,但在 ios 11 剖面视图中重复或与展开的单元格数据重叠。
下面是我的代码
//MARK: -Table View delegate Method
func numberOfSections(in tableView: UITableView) -> Int
return read_Localizable("titleHelpSection").components(separatedBy: ",").count
//MARK: -Table View Datasource Method
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
return UITableViewAutomaticDimension
func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat
return 44.0
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
var headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "headerView")
let arrSection = read_Localizable("titleHelpSection").components(separatedBy: ",")
if headerView == nil
headerView = UITableViewHeaderFooterView(reuseIdentifier: "headerView")
headerView?.contentView.backgroundColor = UIColor.white
let lblResult = UILabel()
lblResult.tag = 123456
lblResult.font = AppCommonSNMediumFont()
lblResult.textColor = UIColor.black
lblResult.translatesAutoresizingMaskIntoConstraints = false
headerView?.contentView.addSubview(lblResult)
let seperator = UIView()
seperator.translatesAutoresizingMaskIntoConstraints = false
seperator.backgroundColor = UIColor.black
headerView?.contentView.addSubview(seperator)
headerView?.contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[seperator]|", options: [], metrics: nil, views: ["seperator":seperator]))
headerView?.contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-[lable]-(>=8)-|", options: [], metrics: nil, views: ["lable":lblResult]))
headerView?.contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-[lable]-[seperator(1)]|", options: [], metrics: nil, views: ["lable":lblResult,"seperator":seperator]))
if let lblResult = headerView?.contentView.viewWithTag(123456) as? UILabel
lblResult.text = arrSection[section]
return headerView
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return UITableViewAutomaticDimension
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat
return 20.0
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
if section == 0
return (arrHelpData.count)
else
return 1
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if indexPath.section == 0
var cell = tableView.dequeueReusableCell(withIdentifier: "HelpCell") as? CellHelp;
if cell == nil
cell = CellHelp(style: .default, reuseIdentifier: "HelpCell")
cell?.selectionStyle = .none
cell?.txtContain.delegate = self
if let objModel = arrHelpData.object(at: indexPath.row) as? HelpModel
cell?.lblTitle.text = objModel.helpTitle
if objModel.isExpanded == true
cell?.txtContain.text = objModel.helpDesc
else
cell?.txtContain.text = ""
cell?.imgArrow.isHighlighted = !objModel.isExpanded
return cell!
else
var cell = tableView.dequeueReusableCell(withIdentifier: "DefultCell")
if cell == nil
cell = UITableViewCell(style: .default, reuseIdentifier: "DefultCell")
cell?.textLabel?.textColor = color1F87A3()
cell?.textLabel?.font = AppCommonSNRegularFont()
cell?.selectionStyle = .none
cell?.textLabel?.numberOfLines = 0
cell?.textLabel?.text = read_Localizable("titleSettings")
return cell!
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
if indexPath.section == 0 && indexPath.row < (arrHelpData.count)
if let objModel = arrHelpData.object(at: indexPath.row) as? HelpModel
if objModel.isExpanded == true
objModel.isExpanded = false
else
objModel.isExpanded = true
tableView.reloadData()
实景
与单元格数据重叠的部分
【问题讨论】:
【参考方案1】:这是一个非常令人沮丧的 iOS11 问题,需要围绕估计高度问题做一些事情,如果你真的想保持自己大小的行和标题,那么你需要使用下面的方法。
声明变量,它保存单元格/标题的高度并将高度存储到其中并使用如下:
var cellHeightDictionary: NSMutableDictionary // To overcome the issue of iOS11.2
override func viewDidLoad()
super.viewDidLoad()
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 125
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
这是唯一适用于 iOS11 自动调整单元格问题的解决方案。否则,人们建议保留estimatedHeight 0 以摆脱此类问题。 在您的情况下,首先尝试对单元格执行此操作,但这并不能完全解决问题,然后对标题高度也执行相同操作。希望这会有所帮助!
别忘了在 iOS11.1 和 iOS11.2 中测试。
【讨论】:
以上是关于ios 11 UITableViewHeaderFooterView 无法正确滚动动画的主要内容,如果未能解决你的问题,请参考以下文章
AVPlayerViewController 视频适用于 iOS 11、12,但不适用于 iPhone 11 的 iOS 13