如何在 table 视图行高变化时添加动画?
how to add animation when table view row height is changing?
我正在尝试制作一个FAQ视图控制器,我知道有pods叫'FAQView'来制作这个FAQ页面,但我需要定制,所以我自己制作。我希望我的最终结果是这样的
展开行时有一点动画,我需要添加那个动画。我对这个 FAQ 的 table 看法是这样的
我想在某个单元格的行高从 80 变为 140 时添加动画
这是我的代码,我的视图控制器代码:
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var FAQs = [FAQ]()
@IBOutlet weak var tableView: UITableView!
var selectedRow : Int?
var cellIsExpanded : Bool = false {
didSet {
tableView.reloadData()
}
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
getFAQ()
}
func getFAQ() {
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return FAQs.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "FAQCell") as! TableViewCell
cell.FAQData = FAQs[indexPath.row]
cell.expandButton.tag = indexPath.row
// to implement FAQCellDelegate
cell.cellDelegate = self
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
var height:CGFloat = CGFloat()
if cellIsExpanded == false {
height = 80
} else {
if indexPath.row == selectedRow {
height = 160
} else {
height = 80
}
}
return height
}
}
extension ViewController : FAQCellDelegate {
func didPressButton(isExpanded: Bool, tag: Int) {
cellIsExpanded = isExpanded
selectedRow = tag
}
}
我的 Table View Cell 代码如下所示
import UIKit
protocol FAQCellDelegate : class {
func didPressButton(isExpanded: Bool, tag: Int)
}
class TableViewCell: UITableViewCell {
@IBOutlet weak var questionLabel: UILabel!
@IBOutlet weak var answerLabel: UILabel!
@IBOutlet weak var expandButton: UIButton!
var expanded = false
var FAQData : FAQ! {
didSet {
questionLabel.text = FAQData.question
answerLabel.text = FAQData.answer
}
}
weak var cellDelegate: FAQCellDelegate?
@IBAction func expandButtonDidPressed(_ sender: Any) {
if expanded == true {
expanded = false
cellDelegate?.didPressButton(isExpanded: expanded, tag: expandButton.tag)
} else {
expanded = true
cellDelegate?.didPressButton(isExpanded: expanded, tag: expandButton.tag)
}
}
}
在 didPressButton 函数中添加 "self.tableView.reloadData()" 行,如下所示
func didPressButton(isExpanded: Bool, tag: Int) {
cellIsExpanded = isExpanded
selectedRow = tag
self.tableView.reloadData()
}
在 expandButtonDidPressed 函数上添加动画,如下所示
@IBAction func expandButtonDidPressed(_ sender: Any) {
if expanded == true {
expanded = false
cellDelegate?.didPressButton(isExpanded: expanded, tag: expandButton.tag)
} else {
expanded = true
cellDelegate?.didPressButton(isExpanded: expanded, tag: expandButton.tag)
}
self.animate(withDuration: 0.25, animations: {
sender.transform = CGAffineTransform(rotationAngle: CGFloat.pi)
})
}
设置 'cellIsExpanded' 后,不要重新加载表格视图,而是调用以下方法。使用以下代码
在iOS11,
- (void)performBatchUpdates:(void (NS_NOESCAPE ^ _Nullable)(void))updates completion:(void (^ _Nullable)(BOOL finished))completion
iOS 10 或以下,
- (void)beginUpdates;
- (void)endUpdates;
你应该这样做,我已经为简单的tableview做了。请做适当的修改。
像这样声明selectedIndexs
,
var selectedIndexs: [IndexPath: Bool] = [:]
实现这个方法,
func cellIsSelected(indexPath: IndexPath) -> Bool {
if let number = selectedIndexs[indexPath] {
return number
} else {
return false
}
}
现在 didSelectRowAt indexPath
extension ViewController: UITableViewDelegate{
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let isSelected = !self.cellIsSelected(indexPath: indexPath)
selectedIndexs[indexPath] = isSelected
tableView.beginUpdates()
tableView.endUpdates()
}
}
像这样实现heightForRowAt indexPath
方法,
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if self.cellIsSelected(indexPath: indexPath) {
return 100
} else {
return 44
}
}
当用户在 didSelectRowAt indexPath
方法中点击任何单元格时,我对 TableViewCell 的高度进行了动画处理,您也可以在按钮点击事件中执行此操作。进行必要的更改并完成。
如有任何疑问,请告诉我。
争取 CollapsibleHeader。我一直在我的几个应用程序中使用它。提供优雅的动画,正是您想要的。更不用说,很容易集成。
我正在尝试制作一个FAQ视图控制器,我知道有pods叫'FAQView'来制作这个FAQ页面,但我需要定制,所以我自己制作。我希望我的最终结果是这样的
展开行时有一点动画,我需要添加那个动画。我对这个 FAQ 的 table 看法是这样的
我想在某个单元格的行高从 80 变为 140 时添加动画
这是我的代码,我的视图控制器代码:
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var FAQs = [FAQ]()
@IBOutlet weak var tableView: UITableView!
var selectedRow : Int?
var cellIsExpanded : Bool = false {
didSet {
tableView.reloadData()
}
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
getFAQ()
}
func getFAQ() {
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return FAQs.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "FAQCell") as! TableViewCell
cell.FAQData = FAQs[indexPath.row]
cell.expandButton.tag = indexPath.row
// to implement FAQCellDelegate
cell.cellDelegate = self
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
var height:CGFloat = CGFloat()
if cellIsExpanded == false {
height = 80
} else {
if indexPath.row == selectedRow {
height = 160
} else {
height = 80
}
}
return height
}
}
extension ViewController : FAQCellDelegate {
func didPressButton(isExpanded: Bool, tag: Int) {
cellIsExpanded = isExpanded
selectedRow = tag
}
}
我的 Table View Cell 代码如下所示
import UIKit
protocol FAQCellDelegate : class {
func didPressButton(isExpanded: Bool, tag: Int)
}
class TableViewCell: UITableViewCell {
@IBOutlet weak var questionLabel: UILabel!
@IBOutlet weak var answerLabel: UILabel!
@IBOutlet weak var expandButton: UIButton!
var expanded = false
var FAQData : FAQ! {
didSet {
questionLabel.text = FAQData.question
answerLabel.text = FAQData.answer
}
}
weak var cellDelegate: FAQCellDelegate?
@IBAction func expandButtonDidPressed(_ sender: Any) {
if expanded == true {
expanded = false
cellDelegate?.didPressButton(isExpanded: expanded, tag: expandButton.tag)
} else {
expanded = true
cellDelegate?.didPressButton(isExpanded: expanded, tag: expandButton.tag)
}
}
}
在 didPressButton 函数中添加 "self.tableView.reloadData()" 行,如下所示
func didPressButton(isExpanded: Bool, tag: Int) {
cellIsExpanded = isExpanded
selectedRow = tag
self.tableView.reloadData()
}
在 expandButtonDidPressed 函数上添加动画,如下所示
@IBAction func expandButtonDidPressed(_ sender: Any) {
if expanded == true {
expanded = false
cellDelegate?.didPressButton(isExpanded: expanded, tag: expandButton.tag)
} else {
expanded = true
cellDelegate?.didPressButton(isExpanded: expanded, tag: expandButton.tag)
}
self.animate(withDuration: 0.25, animations: {
sender.transform = CGAffineTransform(rotationAngle: CGFloat.pi)
})
}
设置 'cellIsExpanded' 后,不要重新加载表格视图,而是调用以下方法。使用以下代码
在iOS11,
- (void)performBatchUpdates:(void (NS_NOESCAPE ^ _Nullable)(void))updates completion:(void (^ _Nullable)(BOOL finished))completion
iOS 10 或以下,
- (void)beginUpdates;
- (void)endUpdates;
你应该这样做,我已经为简单的tableview做了。请做适当的修改。
像这样声明selectedIndexs
,
var selectedIndexs: [IndexPath: Bool] = [:]
实现这个方法,
func cellIsSelected(indexPath: IndexPath) -> Bool {
if let number = selectedIndexs[indexPath] {
return number
} else {
return false
}
}
现在 didSelectRowAt indexPath
extension ViewController: UITableViewDelegate{
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let isSelected = !self.cellIsSelected(indexPath: indexPath)
selectedIndexs[indexPath] = isSelected
tableView.beginUpdates()
tableView.endUpdates()
}
}
像这样实现heightForRowAt indexPath
方法,
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if self.cellIsSelected(indexPath: indexPath) {
return 100
} else {
return 44
}
}
当用户在 didSelectRowAt indexPath
方法中点击任何单元格时,我对 TableViewCell 的高度进行了动画处理,您也可以在按钮点击事件中执行此操作。进行必要的更改并完成。
如有任何疑问,请告诉我。
争取 CollapsibleHeader。我一直在我的几个应用程序中使用它。提供优雅的动画,正是您想要的。更不用说,很容易集成。