在点击时更改UITableViewCell高度时抖动动画

时间:2016-01-13 14:53:58

标签: ios swift uitableview uianimation

UITableView单元格高度变化在iPad和iPhone 6S上有不稳定的动画效果,但在iPhone 6上工作正常。我在UITableView单元格中有UIImageView(3/4比例),动态单元格高度(下面的代码)。我想在任何设备类型上适合全宽度的图像。

此时,我的代码适用于所有设备。问题出在iPad和iPhone 6 Plus上,高度变化动画并不顺畅。在iPhone 6上,它流畅。那么有谁能告诉我我做错了什么?或者我应该做些什么来使单元格高度变化动画在所有设备上正常工作?

我使用以下代码:

// Using PFQueryTableViewController
 let screenSize: CGRect = UIScreen.mainScreen().bounds
    var selectedCellIndexPath: NSIndexPath?
    var SelectedCellHeight = CGFloat() 
    var UnselectedCellHeight = CGFloat() 
  ....

   override func viewDidLoad() {
        super.viewDidLoad()

// This is how I am currently checking the tableView cell height on tap.
        if screenSize.width > 700 {
            SelectedCellHeight = 1000.0
            UnselectedCellHeight = 778.0
        } else {
            SelectedCellHeight = 522.0
            UnselectedCellHeight = 320.0
        }
        print(screenSize.width)
        print(screenSize.height)   
    }



override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if let selectedCellIndexPath = selectedCellIndexPath {
        if selectedCellIndexPath == indexPath {
            return SelectedCellHeight
        }
    }
    return UnselectedCellHeight
}


  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell {

        var cell = tableView.dequeueReusableCellWithIdentifier("cell") as! DataViewTableViewCell!
        if cell == nil {
            cell = DataViewTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
        }

        let sTap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "sTap")
        sTap.numberOfTapsRequired = 1
        cell.addGestureRecognizer(sTap)


        // Display main image
        let initialThumbnail = UIImage(named: "DefaultImage")
        cell.postPicture.image = initialThumbnail

        if let thumbnail = object?["postOriginalPicture"] as? PFFile {
            cell.postPicture.file = thumbnail
            cell.postPicture.loadInBackground()  
        }
        return cell
    }


override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    var cell = tableView.dequeueReusableCellWithIdentifier("cell") as! DataViewTableViewCell!
    if cell == nil {
        cell = DataViewTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
    }
 customNSIndexPath = indexPath
}


func sTap() {  // Tap code to increases height of tableView cell

    if let selectedCellIndexPath = selectedCellIndexPath {
        if selectedCellIndexPath == indexPath {
            self.selectedCellIndexPath = nil

        } else {
            self.selectedCellIndexPath = indexPath
        }
    } else {
        selectedCellIndexPath = indexPath
    }
    tableView.beginUpdates()
    tableView.endUpdates()
}

}

1 个答案:

答案 0 :(得分:1)

您的代码中仍然存在一些奇怪的内容,我不确定它们是否解释了您描述的行为,但是在这里它们会出现:

  1. 无需注册您自己的手势识别器 选择时,表格视图会在您设置时自行完成 allowsSelection属性。
  2. 如果您因某些原因想要使用自己的手势识别器, 只将它添加到单元格一次;不要每次都添加一个 细胞被重复使用。
  3. 细胞的出列/创造 在didSelectRowAtIndexPath中没有任何用途
  4. beginUpdates / endUpdates组合之间没有任何内容 什么都不做只有在您想申请时才需要它们 对表的多次更改,全部基于旧索引和 合并动画
  5. 你还需要打电话 reloadRowsAtIndexPaths告诉桌子细胞的大小已经改变了。 在didSelectRowAtIndexPath中使用旧的和新的来做 选择indexPaths。
  6. 有关详细信息,另请参阅Apple's guide