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 无法正确滚动动画的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11开发教程

AVPlayerViewController 视频适用于 iOS 11、12,但不适用于 iPhone 11 的 iOS 13

“命名颜色在 iOS 11.0 之前不起作用。”即使部署目标是 >= iOS 11.0

iOS 11开发教程iOS11模拟器介绍一

iOS 11开发教程iOS11无线连接手机真机测试

iOS 11开发教程(十四)iOS11应用代码添加视图