转自http://blog.csdn.net/zhz459880251/article/details/49839105
大家都知道只需要实现
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {}
1
2
就能实现侧滑删除功能, 但是只能实现一个按钮, 并且样式还很丑_, 然后趁着周末休息时间研究了一下tableViewCell的一些功能(没做优化, 只是研究了一下属性)
这里写图片描述
其实, 从iOS8开始, 苹果就新增了一个API
-
(NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { }
1
可以看到, 返回的是一个UITableViewRowAction数组, 每一个UITableViewRowAction都代表着一个action,
比如 -
(NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath )indexPath {
/ UITableViewRowAction属性- (instancetype)rowActionWithStyle:(UITableViewRowActionStyle)style title:(nullable NSString *)title handler:(void (^)(UITableViewRowAction *action, NSIndexPath *indexPath))handler;
//按钮样式
@property (nonatomic, readonly) UITableViewRowActionStyle style;
//按钮标题
@property (nonatomic, copy, nullable) NSString *title;
//按钮背景色
@property (nonatomic, copy, nullable) UIColor backgroundColor;
//背景毛玻璃效果
@property (nonatomic, copy, nullable) UIVisualEffect backgroundEffect;
*/
//按钮一
UITableViewRowAction *rowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"确定" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
NSLog(@"确定按钮");
}];
rowAction.backgroundColor = [UIColor redColor];
//按钮二
UITableViewRowAction *rowAction1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
NSLog(@"删除按钮");
}];
rowAction1.backgroundColor = [UIColor grayColor];
//按钮三
UITableViewRowAction *rowAction2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"清除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
NSLog(@"清除按钮");
}];
rowAction2.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"1.jpg"]];return @[rowAction, rowAction1, rowAction2];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
细心的人可能会发现, 我的第一个action是”确定”, 怎么变成了”删除”, 还是红色的
其实, 我只是重写了cell, 对cell的子控件经行了拦截
方法一, (这是我最开始用的方法)
/*
重新布局, 设置delete按钮背景色
*/
-
(void)layoutSubviews
{
[super layoutSubviews];for (UIView *subView in self.subviews) {
if ([NSStringFromClass([subView class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { ((UIView *)[subView.subviews firstObject]).backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1.0]; NSLog(@"%@", NSStringFromCGRect(((UIView *)[subView.subviews firstObject].superview).frame)); NSLog(@"%@", (UIView *)[subView.subviews firstObject].superview); CGRect frame = self.contentView.subviews[0].frame; frame.size.width = [UIScreen mainScreen].bounds.size.width - ((UIView *)[subView.subviews firstObject]).superview.frame.size.width; self.contentView.subviews[0].frame = frame; NSLog(@"--%@", NSStringFromCGRect(self.contentView.subviews[0].bounds)); }
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
方法二: (个人建议使用)
// 用户某一行开始侧滑, 并且侧滑的button还没展示出来时, state的值为UITableViewCellStateShowingDeleteConfirmationMask
// 但是由于侧滑的view 是懒加载的, 这个时候还没创建出来, 所以使用延时加载
/**state
UITableViewCellStateDefaultMask = 0,
UITableViewCellStateShowingEditControlMask = 1 << 0,
UITableViewCellStateShowingDeleteConfirmationMask = 1 << 1
*/
-
(void)willTransitionToState:(UITableViewCellStateMask)state {
NSLog(@"%s, %d", FUNCTION, LINE);dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.001 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
for (UIView *subView in self.subviews) {if ([NSStringFromClass([subView class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { UIView *view = ((UIView *)[subView.subviews firstObject]); //view : <_UITableViewCellActionButton: 0x7fbe61f1b0d0; frame = (132 0; 66 44); opaque = NO; autoresize = H; layer = <CALayer: 0x7fbe61f1cd50>> //view.superview: <UITableViewCellDeleteConfirmationView: 0x7fbe61de34d0; frame = (415.333 0; 0 44); clipsToBounds = YES; autoresize = H; layer = <CALayer: 0x7fbe61de3680>> view.backgroundColor = [UIColor clearColor]; view.superview.backgroundColor = [UIColor clearColor]; // view.backgroundColor = self.backgroundColor; NSLog(@"%@", view.subviews[0]); /** *view.subviews = { <UIButtonLabel: 0x7fa769549440; frame = (15 11; 52.3333 21.6667); text = 'Delete'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fa769548cd0>> } */ //替换字体 [view.subviews[0] setValue:@"删除" forKey:@"text"]; //替换字体颜色 [view.subviews[0] setValue:[UIColor redColor] forKeyPath:@"textColor"];
//也可以直接设置view.layer 但是不会出现边框跟着移动的效果(下图), 这也说明了, UITableViewCellDeleteConfirmationView的frame是跟着你的手指移动在变化的
view.superview.layer.cornerRadius = 10.0;
view.superview.layer.borderWidth = 2.0;
view.superview.layer.borderColor = [UIColor greenColor].CGColor;
view.superview.layer.masksToBounds = YES;
}
}
});
}
//button 已经展示出来button, 将要关闭的时候调用
- (void)didTransitionToState:(UITableViewCellStateMask)state {
NSLog(@"%s, %d", FUNCTION, LINE);
}
网友评论