후 나는 화면에 다른 곳으로 끌고 UIPanGestureRecognizer
사용 후 다시 초기 위치에 CALayer
애니메이션을합니다. 여기 CABasicAnimation UIPanGestureRecognizer
@interface ViewController() {
CGPoint defaultButtonPosition;
CGPoint lastPosition;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
defaultButtonPosition = _roundShape.layer.position;
self.view.backgroundColor = [UIColor blackColor];
[_roundShape displayShape];
[self.view.layer addSublayer:_roundShape.layer];
}
//code so I can drag my CALayer
- (IBAction)dragShape:(UIPanGestureRecognizer *)sender
{
CGPoint translation = [sender translationInView:self.view];
sender.view.center = CGPointMake(sender.view.center.x + translation.x, sender.view.center.y + translation.y);
[sender setTranslation:CGPointMake(0, 0) inView:self.view];
lastPosition = sender.view.center;
if (sender.state == UIGestureRecognizerStateEnded) {
NSLog(@"Pan ended");
[self animateBackToOriginalPosition];
_roundShape.center = lastPosition;
}
}
- (void)animateBackToOriginalPosition
{
CABasicAnimation *moveBackToOriginalPosition = [CABasicAnimation animationWithKeyPath:@"position"];
moveBackToOriginalPosition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
moveBackToOriginalPosition.fromValue = [NSValue valueWithCGPoint:lastPosition];
moveBackToOriginalPosition.toValue = [NSValue valueWithCGPoint:defaultPosition];
moveBackToOriginalPosition.repeatCount = 0;
moveBackToOriginalPosition.duration = 1.0;
[_roundShape.layer addAnimation:moveBackToOriginalPosition forKey:@"position"];
}
이 코드에서 발생하는 애니메이션은 내가 원하는 어디에도 없습니다. 내가 끌고있는 CALayer를 놓을 때 갑자기 사라져서 내가 설정 한 toValue (= defaultPosition) 대신 lastPosition에 겉보기에 임의의 위치에서 움직입니다. 그 후 CALayer는 더 이상 볼 수 없습니다.
내가의 CALayer를 드래그 할 때 NSLog는 항상 날이 defaultPosition에서 아직 이야기로 position 속성이 변경되지 않는 것 같다. 그래서 _roundShape.center = lastPosition;
을 사용해 보았습니다.하지만 CALayer가 사라집니다. 이것이 없으면 CALayer가 화면에 계속 표시됩니다.
나는 내 문제를 충분히 설명하기를 희망한다. 내 코드에서 초보자 실수를 듣고 싶습니다.
그래서 나는 defaultPosition 설정을 시도했습니다 (당신도 당신의 이전 위치를 보관할 필요가없는 이런 식으로) 동일 레이어를 뷰로 이동했지만 아무런 차이가 없었습니다. IB로 레이어의 뷰를 만들었으므로 차이가 없습니다. NSLog가 정확한 위치를 보여줍니다. 문제는 lastPosition을 가져올 수없는 것 같습니다. 레이어를 defaultPosition에서 드래그하면 NSLog는 lastPosition이 defaultPosition과 동일하다는 것을 알려줍니다. 그래서 내가 드래그하는 것은 레이어가 아니라 레이어의 복사본 (?) 인 것 같습니다. – iMaddin
레이어를 포함하는 뷰의 중심을 로깅하지 않습니까? 또한 레이어는 layer.position (올바른 좌표를 얻을 수있게되면 CATransform3DMakeTranslation을 사용할 수 있음)을 사용하여 애니메이션으로 만들어야하며 흉곽 인식 메서드에서 앵커 포인트를 올바르게 설정해야합니다. 레이어를 이동하면 많은 좌표 문제가 발생합니다. 레이어의 선택된 지점을 뷰 및 기본 윈도우에서 고려하는 방법을 완전히 이해해야합니다. – NightCoder
좋아요, 이제 오른쪽 lastPosition을 얻습니다. 내가 한 또 다른 실수는 UIPanGestureRecognizer를 잘못된보기에 연결 한 것입니다! 나는 UILabel이 그렇게 움직이지 않았음에도 불구하고 움직이는 것을 보았다. 이제 레이어가 올바른 위치로 이동하지만 이동 한 후 사라지고 다시 드래그 한 위치로 이동합니다. 지금 고칠 수 있어야합니다. – iMaddin