Change Reorder Control's color in table view cell
In iOS13.x seems like reorder control's color is dependent on the Light/Dark mode (earlier it was set on contrast with background, now it appears fixed depending on the mode).
Therefore there is a possibility to switch color of the reorder control by overrideUserInterfaceStyle
of the UITableViewCell.
Default - in the light mode of the phone I get practically invisible controls:
Now applying
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
SelectableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"selectableCell"];
...
cell.overrideUserInterfaceStyle = UIUserInterfaceStyleDark;
return cell;
}
gives following result:
This works for me in my UITableViewController using iOS11 and Swift 4:
private var myReorderImage : UIImage? = nil;
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
for subViewA in cell.subviews {
if (subViewA.classForCoder.description() == "UITableViewCellReorderControl") {
for subViewB in subViewA.subviews {
if (subViewB.isKind(of: UIImageView.classForCoder())) {
let imageView = subViewB as! UIImageView;
if (myReorderImage == nil) {
let myImage = imageView.image;
myReorderImage = myImage?.withRenderingMode(UIImageRenderingMode.alwaysTemplate);
}
imageView.image = myReorderImage;
imageView.tintColor = UIColor.red;
break;
}
}
break;
}
}
}
I use an extension to find the reorder control imageView.
extension UITableViewCell {
var reorderControlImageView: UIImageView? {
let reorderControl = self.subviews.first { view -> Bool in
view.classForCoder.description() == "UITableViewCellReorderControl"
}
return reorderControl?.subviews.first { view -> Bool in
view is UIImageView
} as? UIImageView
}
}
In willDisplay I update the tintColor of the image view.
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.reorderControlImageView?.tint(color: Color.text.uiColor)
}
Setting a tint color with a UIImageView extension
extension UIImageView {
func tint(color: UIColor) {
self.image = self.image?.withRenderingMode(.alwaysTemplate)
self.tintColor = color
}
}