在table视图编辑模式下修改重新排序控件图标
Modify reorder control icon in table view editing mode
我想为 table 视图编辑模式中出现的汉堡包图标使用自定义颜色,甚至最好使用自定义图像。我在最初位于 Objective-C 的旧线程中找到了这个 Swift 代码片段(可在此处找到:Change default icon for moving cells in UITableView):
override func setEditing(editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
if editing {
for view in subviews as [UIView] {
if view.dynamicType.description().rangeOfString("Reorder") != nil {
for subview in view.subviews as [UIImageView] {
if subview.isKindOfClass(UIImageView) {
subview.image = UIImage(named: "yourimage.png")
}
}
}
}
}
}
为了适应我的 TableViewController
,我将开始循环的行更改为:
for view in tableView.subviews as [UIView] {
这似乎有效,但将找不到描述为 "Reorder" 的视图。这之后有没有改变?
我会在旧线程中询问,但由于声誉问题,我还没有被允许。
非常欢迎任何见解!
编辑:我可以通过将上面的代码更改为来更改图像:
override func setEditing(editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
if editing {
for cell in tableView.visibleCells {
for view in cell.subviews {
if view.dynamicType.description().rangeOfString("Reorder") != nil {
for subview in view.subviews as! [UIImageView] {
if subview.isKindOfClass(UIImageView) {
subview.image = UIImage(named: "yourimage.png")
//subview.frame = CGRect(x: 0, y: 0, width: 20, height: 20)
}
}
}
}
}
}
}
有一个错误,但是,当向下滚动时,并不是所有的图标都会改变。一些单元格仍将具有原始图标。我想这与重复使用的细胞有关。有什么解决办法吗?
编辑 2:我通过确保在 cellForRowAtIndexPath
方法中执行相同的图像替换逻辑来解决上述问题。另外,我正在检查图像是否已经更改,因为如果之前有图像,图像会有奇怪的偏移。
override func setEditing(editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
if editing {
for cell in tableView.visibleCells {
setEditingAccessoryView(forCell: cell)
}
}
}
func setEditingAccessoryView(forCell cell: UITableViewCell) {
for view in cell.subviews {
if view.dynamicType.description().rangeOfString("Reorder") != nil {
for subview in view.subviews as! [UIImageView] {
if subview.isKindOfClass(UIImageView) {
if subview.image != UIImage(named: "yourImage.png") {
subview.image = UIImage(named: "yourImage.png")
//subview.frame = CGRect(x: 20, y: 20, width: 20, height: 20)
}
}
}
}
}
}
在 cellForRowAtIndexPath 中:
if editing {
setEditingAccessoryView(forCell: cell)
}
很高兴我们解决了您的问题。对于您的最后一个问题,我建议您在 cellForRowAtIndexPath:
中显式调用替换逻辑以在每次显示单元格时强制调用您的代码。
(顺便说一句,日志记录始终是解决令人费解的问题的好方法,)
我想为 table 视图编辑模式中出现的汉堡包图标使用自定义颜色,甚至最好使用自定义图像。我在最初位于 Objective-C 的旧线程中找到了这个 Swift 代码片段(可在此处找到:Change default icon for moving cells in UITableView):
override func setEditing(editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
if editing {
for view in subviews as [UIView] {
if view.dynamicType.description().rangeOfString("Reorder") != nil {
for subview in view.subviews as [UIImageView] {
if subview.isKindOfClass(UIImageView) {
subview.image = UIImage(named: "yourimage.png")
}
}
}
}
}
}
为了适应我的 TableViewController
,我将开始循环的行更改为:
for view in tableView.subviews as [UIView] {
这似乎有效,但将找不到描述为 "Reorder" 的视图。这之后有没有改变?
我会在旧线程中询问,但由于声誉问题,我还没有被允许。
非常欢迎任何见解!
编辑:我可以通过将上面的代码更改为来更改图像:
override func setEditing(editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
if editing {
for cell in tableView.visibleCells {
for view in cell.subviews {
if view.dynamicType.description().rangeOfString("Reorder") != nil {
for subview in view.subviews as! [UIImageView] {
if subview.isKindOfClass(UIImageView) {
subview.image = UIImage(named: "yourimage.png")
//subview.frame = CGRect(x: 0, y: 0, width: 20, height: 20)
}
}
}
}
}
}
}
有一个错误,但是,当向下滚动时,并不是所有的图标都会改变。一些单元格仍将具有原始图标。我想这与重复使用的细胞有关。有什么解决办法吗?
编辑 2:我通过确保在 cellForRowAtIndexPath
方法中执行相同的图像替换逻辑来解决上述问题。另外,我正在检查图像是否已经更改,因为如果之前有图像,图像会有奇怪的偏移。
override func setEditing(editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
if editing {
for cell in tableView.visibleCells {
setEditingAccessoryView(forCell: cell)
}
}
}
func setEditingAccessoryView(forCell cell: UITableViewCell) {
for view in cell.subviews {
if view.dynamicType.description().rangeOfString("Reorder") != nil {
for subview in view.subviews as! [UIImageView] {
if subview.isKindOfClass(UIImageView) {
if subview.image != UIImage(named: "yourImage.png") {
subview.image = UIImage(named: "yourImage.png")
//subview.frame = CGRect(x: 20, y: 20, width: 20, height: 20)
}
}
}
}
}
}
在 cellForRowAtIndexPath 中:
if editing {
setEditingAccessoryView(forCell: cell)
}
很高兴我们解决了您的问题。对于您的最后一个问题,我建议您在 cellForRowAtIndexPath:
中显式调用替换逻辑以在每次显示单元格时强制调用您的代码。
(顺便说一句,日志记录始终是解决令人费解的问题的好方法,)