如何防止 UITableViewCell 移动 (Swift 5)
How to prevent a UITableViewCell from moving (Swift 5)
这实际上是一个两部分的问题。先来看看代码:
//canEditRowAt
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
if tableView.tag == 1000{
return indexPath.row == 0 ? false : true
}
return true
}
//canMoveRowAt
func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
if tableView.tag == 1000{
return indexPath.row == 0 ? false : true
}
return true
}
因此,我预计它会阻止索引 0 处的行让其他单元格移动到它,但是不会...如您所见:
我显然想阻止它,但似乎找不到任何文档来解决这个问题。
我正在努力的另一点;如果你看一下录音,你会发现一旦我将一个单元格移动到任何位置,单元格后面就会出现一个黑条。我也想避免这种情况发生,并且尝试了几种方法但没有任何效果。
感谢任何帮助,谢谢!
要回答第一个问题,如果您查看 tableView(_:canMoveRowAt:)
documentation :
This method allows the data source to specify that the reordering
control for the specified row not be shown. By default, the reordering
control is shown if the data source implements the
tableView(_:moveRowAt:to:) method.
这里主要是说reordering control
被显示出来,而不是具体说它永远不能移动。因此,如果您查看 UI,reordering control
不会显示 indexPath.row == 0
我可以建议 2 个备选方案:
1.反转移动动作
override func tableView(_ tableView: UITableView,
moveRowAt sourceIndexPath: IndexPath,
to destinationIndexPath: IndexPath)
{
// Reverse the action for the first row
if destinationIndexPath.row == 0
{
// You need the give a slight delay as the table view
// is still completing the first move animation
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
{
tableView.beginUpdates()
tableView.moveRow(at: destinationIndexPath,
to: sourceIndexPath)
tableView.endUpdates()
}
return
}
// update the data source
}
2。用户 header 观看
这样您就不必担心指定哪些单元格可以移动哪些单元格不能移动的任何逻辑,因为您可以在 header 视图中拥有不可移动的数据:
override func tableView(_ tableView: UITableView,
viewForHeaderInSection section: Int) -> UIView?
{
if section == 0
{
// Customize any view
let headerView = UIView(frame: CGRect(x: 0,
y: 0,
width: tableView.bounds.width,
height: 100))
headerView.backgroundColor = .red
let label = UILabel(frame: headerView.bounds)
label.text = "Header view"
label.textColor = .white
label.textAlignment = .center
headerView.addSubview(label)
return headerView
}
return nil
}
override func tableView(_ tableView: UITableView,
heightForHeaderInSection section: Int) -> CGFloat
{
if section == 0
{
// specify any height
return 100
}
return 0
}
我推荐第二个选项,因为它有更好的用户体验,而且似乎是解决这个问题的正确方法。
要回答您的第二个问题,在您的 cellForRowAt indexPath
或自定义单元格实现中,您可能将单元格或 contentView
的背景视图设置为黑色。
尝试设置其中之一或两者:
cell.backgroundColor = .clear
cell.contentView.backgroundColor = .clear
这不应该给你黑色背景
实施 tableView(_:targetIndexPathForMoveFromRowAt:toProposedIndexPath:)
并确保永远不会 return 编辑第 0 行(当 proposedDestinationIndexPath
是第 0 行时 return 第 1 行)。
这实际上是一个两部分的问题。先来看看代码:
//canEditRowAt
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
if tableView.tag == 1000{
return indexPath.row == 0 ? false : true
}
return true
}
//canMoveRowAt
func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
if tableView.tag == 1000{
return indexPath.row == 0 ? false : true
}
return true
}
因此,我预计它会阻止索引 0 处的行让其他单元格移动到它,但是不会...如您所见:
我显然想阻止它,但似乎找不到任何文档来解决这个问题。
我正在努力的另一点;如果你看一下录音,你会发现一旦我将一个单元格移动到任何位置,单元格后面就会出现一个黑条。我也想避免这种情况发生,并且尝试了几种方法但没有任何效果。
感谢任何帮助,谢谢!
要回答第一个问题,如果您查看 tableView(_:canMoveRowAt:)
documentation :
This method allows the data source to specify that the reordering control for the specified row not be shown. By default, the reordering control is shown if the data source implements the tableView(_:moveRowAt:to:) method.
这里主要是说reordering control
被显示出来,而不是具体说它永远不能移动。因此,如果您查看 UI,reordering control
不会显示 indexPath.row == 0
我可以建议 2 个备选方案:
1.反转移动动作
override func tableView(_ tableView: UITableView,
moveRowAt sourceIndexPath: IndexPath,
to destinationIndexPath: IndexPath)
{
// Reverse the action for the first row
if destinationIndexPath.row == 0
{
// You need the give a slight delay as the table view
// is still completing the first move animation
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
{
tableView.beginUpdates()
tableView.moveRow(at: destinationIndexPath,
to: sourceIndexPath)
tableView.endUpdates()
}
return
}
// update the data source
}
2。用户 header 观看
这样您就不必担心指定哪些单元格可以移动哪些单元格不能移动的任何逻辑,因为您可以在 header 视图中拥有不可移动的数据:
override func tableView(_ tableView: UITableView,
viewForHeaderInSection section: Int) -> UIView?
{
if section == 0
{
// Customize any view
let headerView = UIView(frame: CGRect(x: 0,
y: 0,
width: tableView.bounds.width,
height: 100))
headerView.backgroundColor = .red
let label = UILabel(frame: headerView.bounds)
label.text = "Header view"
label.textColor = .white
label.textAlignment = .center
headerView.addSubview(label)
return headerView
}
return nil
}
override func tableView(_ tableView: UITableView,
heightForHeaderInSection section: Int) -> CGFloat
{
if section == 0
{
// specify any height
return 100
}
return 0
}
我推荐第二个选项,因为它有更好的用户体验,而且似乎是解决这个问题的正确方法。
要回答您的第二个问题,在您的 cellForRowAt indexPath
或自定义单元格实现中,您可能将单元格或 contentView
的背景视图设置为黑色。
尝试设置其中之一或两者:
cell.backgroundColor = .clear
cell.contentView.backgroundColor = .clear
这不应该给你黑色背景
实施 tableView(_:targetIndexPathForMoveFromRowAt:toProposedIndexPath:)
并确保永远不会 return 编辑第 0 行(当 proposedDestinationIndexPath
是第 0 行时 return 第 1 行)。