@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 250.f, 20)];
self.contentView.layer.borderWidth = 0.5f;
// 注意这个代码很重要,裁剪掉父视图bounds范围外的子layer
// 还有view的clipsToBounds属性
self.contentView.layer.masksToBounds = YES;
self.contentView.layer.borderColor = [[UIColor grayColor] colorWithAlphaComponent:0.25f].CGColor;
self.contentView.center = self.view.center;
[self.view addSubview:self.contentView];
self.label = [[UILabel alloc] initWithFrame:CGRectMake(self.contentView.width, 0, 300, self.contentView.height)];
self.label.backgroundColor = [UIColor cyanColor];
[self.contentView addSubview:self.label];
[self doAnimation];
UIPanGestureRecognizer *tapGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureEvent:)];
tapGesture.delegate = self;
[self.contentView addGestureRecognizer:tapGesture];
}
- (void)doAnimation {
CGPoint fromPoint = CGPointMake(self.contentView.width + self.label.width / 2.f, self.contentView.height / 2.f);
UIBezierPath *movePath = [UIBezierPath bezierPath];
[movePath moveToPoint:fromPoint];
[movePath addLineToPoint:CGPointMake(-self.label.width / 2, self.contentView.height / 2.f)];
CAKeyframeAnimation *moveAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
moveAnimation.path = movePath.CGPath;
moveAnimation.removedOnCompletion = YES;
moveAnimation.duration = 8.f;
moveAnimation.delegate = self;
[self.label.layer addAnimation:moveAnimation forKey:nil];
}
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
if (flag) {
[self doAnimation];
}
}
- (void)pauseLayer:(CALayer*)layer {
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
- (void)resumeLayer:(CALayer*)layer {
CFTimeInterval pausedTime = layer.timeOffset;
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}
- (void)tapGestureEvent:(UIPanGestureRecognizer *)tapGesture {
if (tapGesture.state == UIGestureRecognizerStateBegan) {
NSLog(@"拖拽");
[self pauseLayer:self.label.layer];
} else if (tapGesture.state == UIGestureRecognizerStateEnded) {
NSLog(@"释放");
[self resumeLayer:self.label.layer];
}
}