UITableView重新排序控件未隐藏

时间:2018-08-04 18:02:07

标签: ios uitableview

我正在使用Xcode 10.0 beta 4,因此这可能只是一个错误。


目标:

隐藏允许UITableViewCell进行重新排序时出现的重新排序控件,或将其覆盖在表格视图单元格上,而不是将表格视图单元格移到侧面。

问题:

为表格视图单元格设置showsReorderControl = false无效。


情况:

CategoryTableViewCell:

class CategoryTableViewCell: UITableViewCell {

   @IBOutlet weak var titleLabel: UILabel!

   // `colorPanel` is constrained via auto layout to the cell's borders minus an inset.
   @IBOutlet weak var colorPanel: ColorPanel!

   //...
}


ColorPanel

// Pure 'UIView's are not drawn during table view cell reordering. This is a workaround for that.
class ColorPanel: UIView {

   // Makes sure the view is never cleared.
   override var backgroundColor: UIColor? {
      didSet {
         if backgroundColor?.cgColor.alpha == 0 {
            backgroundColor = oldValue
         }
      }
   }

   override func awakeFromNib() {
      layer.cornerRadius = 20
      translatesAutoresizingMaskIntoConstraints = false
   }
}


CategoryTableViewController:

class CategoryTableViewController: UITableViewController {

   override func viewDidLoad() {
      super.viewDidLoad()

      tableView.rowHeight = 70

      tableView.setEditing(true, animated: false)
   }

   override func viewWillAppear(_ animated: Bool) {
      super.viewWillAppear(animated)
      tableView.reloadData()
   }

   override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(
         withIdentifier: "CategoryTableViewCell",
         for: indexPath
      ) as! CategoryTableViewCell

      cell.showsReorderControl = false
      //...

      return cell
   }

   override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
      return true
   }

   override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
      return .none
   }

   override func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool {
      return false
   }

   override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
      return true
   }

   //...
}

输出:

Output


我该怎么做才能摆脱重新排序控件?

3 个答案:

答案 0 :(得分:1)

我能够使用隐藏的重新排序控件图标实现重新排序的唯一方法是覆盖 layoutSubviews 并设置contentView的框架以匹配父对象的边界,如下所示:

override func layoutSubviews() {
    super.layoutSubviews()

    self.contentView.frame = self.bounds
}

答案 1 :(得分:0)

您正试图同时做到。根据{{​​1}}

的文档
  

此方法允许数据源指定不显示指定行的重新排序控件。默认情况下,如果数据源实现tableView(_:moveRowAt:to :)方法,则显示重新排序控件。

根据委托人的响应,系统将管理重新排序控件的状态,如tableView(_:canMoveRowAt:)文档中所述

  

要显示重新排序控件,您不仅必须设置此属性,还必须实现UITableViewDataSource方法tableView(:moveRowAt:to :)。另外,如果数据源实现tableView(:canMoveRowAt :)返回false,则重新排序控件不会出现在该指定行中。

通过从您的代表返回showsReorderControl,将显示该控件。

答案 2 :(得分:0)

我遇到了类似的问题

添加此功能即可解决

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    cell.showsReorderControl = false
}

请确保在tableView.reloadData()进入编辑模式后立即调用,因为我是通过如下所示的按钮的IBAction进行操作的

@IBAction func editButtonPressed(_ sender: UIBarButtonItem) {
    tableView.isEditing = !tableView.isEditing
    tableView.reloadData()
    editRoutineButton.title = tableView.isEditing ? "Done" : "Edit"
}