📅  最后修改于: 2023-12-03 15:36:52.191000             🧑  作者: Mango
如果您使用列表视图作为应用程序的一部分, 您可能使用了一个名为“颤动列”的功能。在列表视图中,用户可以左右滑动显示出额外操作,比如删除。这个元素叫做“颤动列(page swiping)”,它本来是列表视图事件之一,可以在 UITableView 或 UICollectionView 上禁止或者开启。
然而, 在有些情况下,您可能会遇到问题,无论您在代码中怎样设置,也无法在列表中观察到颤动列的效果。本文将介绍如何解决这个问题。
以下几种情况中可能导致您的颤动列不工作:
当您自定义 UITableViewCell 子类时,您可以使用系统提供的默认布局(如下所示):
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
然而,如果您要添加额外的视图,则可以通过代码进行添加。如果添加了一个太大的 subview,它可能会压缩 UITableViewCell。如下所示的一个示例代码:
override func layoutSubviews() {
super.layoutSubviews()
mySubView.frame = CGRect(x: 0, y: 0, width: bounds.width, height: bounds.height)
addSubview(mySubView)
}
在这样的情况下,颤动列不起作用!为了正确配置,您可以像下面这样更新代码:
override func layoutSubviews() {
super.layoutSubviews()
mySubView.frame = contentView.bounds
contentView.addSubview(mySubView)
}
当使用 UITableView.register() 方法注册 UITableViewCell 类时,您应该使用正确的ReuseIdentifier。否则,由于 UITableViewCell 的重用机制,将可能导致颤动列的不正常工作。如下所示的代码可以说明这一点:
tableView.register(MyCustomCell.self, forCellWithReuseIdentifier: "reuseIdentifier") //right way
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") // wrong way
为了确保正确设置,您应该使用与归档时的 Identifier 相同的 Identifier。
在您的业务逻辑中,您可能会遇到需要调用 UITableViewCell 的 setEditing() 方法的业务场景。如果您没有通过 super.setEditing() 方法正确调用该方法,也可能导致颤动列不起作用。下面是一个标准的示例代码:
override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
if editing {
//do something
} else {
//do something
}
}
通过 super.setEditing() 的调用,您可以确保所有的 UITableViewCell 事件和 UI 都正常工作。
在列表视图中,颤动列是一项非常有用的功能。但是,有时可能需要额外的调试或者精心的配置方可达到预期的效果。通过上述建议,您可以正确设置 UITableViewCell,从而更方便地管理颤动列。