Change default icon for moving cells in UITableView

前端 未结 11 1458
面向向阳花
面向向阳花 2020-11-28 21:46

I need to change default icon for moving cells in UITableView.

This one:

\"enter

相关标签:
11条回答
  • 2020-11-28 22:22
    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        for (UIControl *control in cell.subviews)
        {       
            if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellReorderControl")] && [control.subviews count] > 0)
            {           
                for (UIControl *someObj in control.subviews)
                {
                    if ([someObj isMemberOfClass:[UIImageView class]])
                    {
                        UIImage *img = [UIImage imageNamed:@"reorder_icon.png"];
                        ((UIImageView*)someObj).frame = CGRectMake(0.0, 0.0, 43.0, 43.0);
                        ((UIImageView*)someObj).image = img;
                    }
                }
            }
        }   
    }
    
    0 讨论(0)
  • 2020-11-28 22:22

    I did this on iOS 12 with swift 4.2

    I hope this helps:

        func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
            for view in cell.subviews {
                if view.self.description.contains("UITableViewCellReorderControl") {
                    for sv in view.subviews {
                        if (sv is UIImageView) {
                            (sv as? UIImageView)?.image = UIImage(named: "your_image")
                            (sv as? UIImageView)?.contentMode = .center
                            sv.frame = CGRect(x: 0, y: 0, width: 25, height: 25)
                        }
                    }
                }
            }
        }
    
    0 讨论(0)
  • 2020-11-28 22:22

    I could not get any other answer to work for me, but I found a solution.

    Grzegorz R. Kulesza's answer almost worked for me but I had to make a couple changes.

    This works with Swift 5 and iOS 13:

    // Change default reorder icon in UITableViewCell
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        let imageView = cell.subviews.first(where: { $0.description.contains("Reorder") })?.subviews.first(where: { $0 is UIImageView }) as? UIImageView
        imageView?.image = UIImage(named: "your_custom_reorder_icon.png")
        let size = cell.bounds.height * 0.6 // scaled for padding between cells
        imageView?.frame.size.width = size
        imageView?.frame.size.height = size
    }
    
    0 讨论(0)
  • 2020-11-28 22:24

    This is a really hacky solution, and may not work long term, but may give you a starting point. The re-order control is a UITableViewCellReorderControl, but that's a private class, so you can't access it directly. However, you could just look through the hierarchy of subviews and find its imageView.

    You can do this by subclassing UITableViewCell and overriding its setEditing:animated: method as follows:

    - (void) setEditing:(BOOL)editing animated:(BOOL)animated
    {
        [super setEditing: editing animated: YES];
    
        if (editing) {
    
            for (UIView * view in self.subviews) {
                if ([NSStringFromClass([view class]) rangeOfString: @"Reorder"].location != NSNotFound) {
                    for (UIView * subview in view.subviews) {
                        if ([subview isKindOfClass: [UIImageView class]]) {
                            ((UIImageView *)subview).image = [UIImage imageNamed: @"yourimage.png"];
                        }
                    }
                }
            }
        }   
    }
    

    Or in Swift

    override func setEditing(_ editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)
    
        if editing {
            for view in subviews where view.description.contains("Reorder") {
                for case let subview as UIImageView in view.subviews {
                    subview.image = UIImage(named: "yourimage.png")
                }
            }
        }
    }
    

    Be warned though... this may not be a long term solution, as Apple could change the view hierarchy at any time.

    0 讨论(0)
  • 2020-11-28 22:26

    Swift 4

       // Change default icon (hamburger) for moving cells in UITableView
        func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
            let imageView = cell.subviews.first(where: { $0.description.contains("Reorder") })?.subviews.first(where: { $0 is UIImageView }) as? UIImageView
    
            imageView?.image = #imageLiteral(resourceName: "new_hamburger_icon") // give here your's new image
            imageView?.contentMode = .center
    
            imageView?.frame.size.width = cell.bounds.height
            imageView?.frame.size.height = cell.bounds.height
        }
    
    0 讨论(0)
提交回复
热议问题