一、需求:列表左侧滑显示图片(如下图)
二、使用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];
}
}
}
}