swift - uitableviewcell - selección de contenido de la imagen de tableview
uitableview swift 4 example (2)
Crea una celda personalizada y anula el conjunto setHighlighted(_ highlighted: Bool, animated: Bool)
para cambiar el tintColor del iamgeView:
override func setHighlighted(_ highlighted: Bool, animated: Bool) {
super.setHighlighted(highlighted, animated: animated)
imageView?.tintColor = highlighted ? UIColor.white : UIColor.green
}
Luego, cuando creas tu celda, configuras la imagen con un UIImageRenderingMode.alwaysTemplate
:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = CustomCell()
cell.imageView?.image = UIImage(named: "custom_image")?.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
cell.imageView?.tintColor = UIColor.green
return cell
}
Mi aplicación tiene una vista de tabla con una imagen y un campo de texto:
- imagen = imagen renderizada como imagen de plantilla (gris claro)
- campo de texto = color de texto negro
Si selecciono una fila, el color de ambos cambiará perfectamente a blanco
Pregunta: cambio la imagen a una imagen en color azul = renderizar como predeterminado. Si ahora selecciono una fila, el color del texto de mi campo de texto cambiará a blanco, pero la imagen permanecerá azul.
Quiero que la imagen cambie el color a blanco también, pero no lo hace.
¿Qué hice mal?
Ejemplo con una imagen renderizada como modo de plantilla => predeterminado: gris | seleccionado automáticamente blanco
Ejemplo con una imagen en color renderizada como modo predeterminado => predeterminado: verde | seleccionado también verde | Blanco esperado, pero se mantiene verde.
Prueba esto:
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var tableView:NSTableView!
var selectIndex = -1
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.delegate = self
self.tableView.dataSource = self
}
func tintedImage(_ image: NSImage, tint: NSColor) -> NSImage {
guard let tinted = image.copy() as? NSImage else { return image }
tinted.lockFocus()
tint.set()
let imageRect = NSRect(origin: NSZeroPoint, size: image.size)
NSRectFillUsingOperation(imageRect, .sourceAtop)
tinted.unlockFocus()
return tinted
}
}
extension ViewController:NSTableViewDataSource, NSTableViewDelegate{
func numberOfRows(in tableView: NSTableView) -> Int {
return 3
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?{
let result = tableView.make(withIdentifier: "imageIcon", owner: self) as! NSTableCellView
if selectIndex == row{
result.imageView?.image = self.tintedImage(NSImage(named:"file")!, tint: NSColor.green)
}else{
result.imageView?.image = self.tintedImage(NSImage(named:"file")!, tint: NSColor.gray)
}
return result
}
func tableView(_ tableView: NSTableView, didAdd rowView: NSTableRowView, forRow row: Int) {
if selectIndex == row{
rowView.backgroundColor = NSColor.blue
}else{
rowView.backgroundColor = NSColor.clear
}
}
func tableViewSelectionDidChange(_ notification: Notification) {
let table = notification.object as! NSTableView
self.selectIndex = tableView.selectedRow
print(table.selectedRow);
table.reloadData()
}
}
Nota: Cambie el color de viewView tintColor según su requisito.