深度模仿谷歌翻译滑动删除动画效果

项目名称:WWRemoveAnimation

项目地址:https://github.com/WilliamZhangWH/WWRemoveAnimation

效果展示

image

实现原理

在cell上添加一个作为白色背景的view,再在view上添加一个滑动手势

1
2
3
4
5
6
7
8
- (void)awakeFromNib {
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panToRemove:)];
self.panGesture = pan;
pan.maximumNumberOfTouches = 1;
pan.minimumNumberOfTouches = 1;
[self.resultBackgroundView addGestureRecognizer:pan];

}

下面代码是对滑动手势的事件处理

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
- (void)panToRemove:(UIPanGestureRecognizer*)recognizer {
/* 开始移动隐藏分割线 */
for (UILabel *edgeLine in self.edgeLines) {
edgeLine.hidden = YES;
}

self.resultBackgroundView.backgroundColor = [UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:1];

CGPoint translation = [recognizer translationInView:self];
recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
recognizer.view.center.y);
[recognizer setTranslation:CGPointZero inView:self];

CGAffineTransform transform = self.resultBackgroundView.transform;
if (translation.x > 0) {/* 向右移动 */
if ((recognizer.view.center.x < WIDTH*3/10 && transform.b < 0) || recognizer.view.center.x > WIDTH*7/10) {
transform = CGAffineTransformRotate(transform, M_PI/(3*WIDTH));
}else{
self.resultBackgroundView.transform=CGAffineTransformIdentity;
return;
}
}else if (translation.x < 0) {/* 向左移动 */
if ((recognizer.view.center.x > WIDTH*7/10 && transform.b > 0) || recognizer.view.center.x < WIDTH*3/10) {
transform = CGAffineTransformRotate(transform, -M_PI/(3*WIDTH));
}else{
self.resultBackgroundView.transform=CGAffineTransformIdentity;
return;
}
}

self.resultBackgroundView.transform = transform;

/* 结束滑动时的操作 */
if (recognizer.state == UIGestureRecognizerStateEnded) {

if (recognizer.view.center.x < 0) {
[UIView animateWithDuration:0.6 animations:^{
recognizer.view.center = CGPointMake(recognizer.view.center.x - WIDTH/2, recognizer.view.center.y);

} completion:nil];
self.resultBackgroundView.transform = CGAffineTransformRotate(transform, -M_PI/(2*WIDTH));
if (self.refreshDataBlock) {
self.refreshDataBlock();
}
}else if (recognizer.view.center.x > WIDTH) {
self.resultBackgroundView.transform=CGAffineTransformIdentity;
[UIView animateWithDuration:0.6 animations:^{
recognizer.view.center = CGPointMake(recognizer.view.center.x + WIDTH/2, recognizer.view.center.y);
} completion:nil];
self.resultBackgroundView.transform = CGAffineTransformRotate(transform, M_PI/(2*WIDTH));
if (self.refreshDataBlock) {
self.refreshDataBlock();
}
}else{
[UIView animateWithDuration:0.6 animations:^{
recognizer.view.center = CGPointMake(WIDTH/2, recognizer.view.center.y);
self.resultBackgroundView.transform=CGAffineTransformIdentity;

for (UILabel *edgeLine in self.edgeLines) {
edgeLine.hidden = NO;
}
self.resultBackgroundView.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
} completion:nil];
}
}
}
如果有不明白的地方可以给我留言。欢迎交流!