使用UITableViewRowAction如何添加图片

一、需求:列表左侧滑显示图片(如下图)


需求图片

二、使用UITableViewRowAction

1、使用的时候发现UITableViewRowAction并没有办法设置图片,这就比较扯了,感觉action应该属于一个button,于是便打开视图控制器观察这个控件子控件组成如下图:


根据视图看到是一个button很开心,于是便遍历cell找这个子控件,竟然没找到,难道图层不对(开始怀疑人生),便接着找父控件如下图:


结果找到了这个控件。于是便开心的遍历这个父控件取出里面的子控件,这个子控件就是一个button,button可以做什么?设置图片?设置标题?问题就这样解决了。

三、ios11以下设置无效。

what?只支持ios11开玩笑,运行程序,打开图层发现层级发生了变化下面是ios8-10的层级:

iOS 8-10层级: UITableView -> UITableViewCell -> UITableViewCellDeleteConfirmationView

找到层级就好解决了,接着遍历解决问题。

四、最重要的来了,上代码,control c + control v的时候来了。

1、添加手机系统对比宏

#define SYSTEM_VERSION_GRETER_THAN(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v)                ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

2、调用时机,在下面的方法调用

- (void)viewDidLayoutSubviews{

    [super viewDidLayoutSubviews];

    [self configSwipeButtons];

}

当然你还需要在tableview的delegate的方法中调用[self.view setNeedsLayout],调用这个方法就会调用上面的方法,在刚开始编辑的时候调用

-(void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath*)indexPath{

     [self.view setNeedsLayout];

}


3、主要调用方法

- (void)configSwipeButtons

{

    // 获取选项按钮的reference

    if (SYSTEM_VERSION_GRETER_THAN(@"11.0"))

    {

        // iOS 11层级 : UITableView -> UISwipeActionPullView

        for (UIView *subview in self.contentTableView.subviews)

        {

//这里写大于等于2是因为我这里需要两个action

            if ([subview isKindOfClass:NSClassFromString(@"UISwipeActionPullView")] && [subview.subviews count] >= 2)

            {

                // 和iOS 10的按钮顺序相反

                UIButton*deleteButton = subview.subviews[1];

                [deleteButtonsetImage:[UIImage imageNamed:@"PlayView_Share"] forState:UIControlStateNormal];

                UIButton*readButton = subview.subviews[0];

                [readButtonsetImage:[UIImage imageNamed:@"PlayView_Delete"] forState:UIControlStateNormal];

            }

        }

    }

    else

    {

        // iOS 8-10层级: UITableView -> UITableViewCell -> UITableViewCellDeleteConfirmationView

        SABPlayListTableViewCell *tableCell = [self.contentTableView cellForRowAtIndexPath:self.indexPath];

        for(UIView*subviewintableCell.subviews)

        {

            if ([subview isKindOfClass:NSClassFromString(@"UITableViewCellDeleteConfirmationView")] && [subview.subviews count] >= 2)

            {

                UIButton*deleteButton = subview.subviews[0];

                [deleteButtonsetImage:[UIImage imageNamed:@"PlayView_Share"] forState:UIControlStateNormal];

                UIButton*readButton = subview.subviews[1];

                [readButtonsetImage:[UIImage imageNamed:@"PlayView_Delete"] forState:UIControlStateNormal];

            }

        }

    }

}

你可能感兴趣的:(使用UITableViewRowAction如何添加图片)