Анимируйте UIImageView в середине анимации
-
12-12-2019 - |
Вопрос
У меня есть объект, который перемещается справа налево по экрану:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:7.8];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
myImageview.layer.position = CGPointMake(20, myImageView.layer.position.y);
[UIView commitAnimations];
Я обнаружил, что даже пока анимация все еще выполняется, XCode уже помечает местоположение изображения как его конечный пункт назначения, и чтобы обнаружить прикосновение к движущемуся изображению, мне нужно использовать presentationLayer:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self.view];
if ([myImageview.layer.presentationLayer hitTest:touchPoint]) {
NSLog(@"it's a hit!");
}
}
Эта часть работает.Теперь я бы хотел, чтобы изображение перемещалось вверх при нажатии на него.Я хочу, чтобы изображение перемещалось вверх, продолжая свое боковое движение. Вместо этого этот код перемещает изображение не только вверх, но и полностью к его конечному пункту назначения слева:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self.view];
if ([mouse.layer.presentationLayer hitTest:touchPoint]) {
NSLog(@"it's a hit!");
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
myImageView.layer.position = CGPointMake( mouse.layer.position.x, myImageView.layer.position.y - 40);
[UIView commitAnimations];
}
}
Я хочу, чтобы изображение перемещалось вверх, продолжая свое боковое движение.Кто-нибудь знает способ добиться этого?
Большое спасибо!
Решение
Вы пробовали настроить опцию анимации UIViewAnimationOptionBeginFromCurrentState
?
(Я говорю "опция", потому что это опция в методах анимации на основе блоков, представленных в iOS 4.Он также доступен в виде [UIView setAnimationBeginsFromCurrentState:YES]
если вы пока не можете отказаться от устаревших методов класса UIView.)
touchesBegan становится (с использованием анимации блоков):
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self.view];
if ([mouse.layer.presentationLayer hitTest:touchPoint]) {
NSLog(@"it's a hit!");
[UIView animateWithDuration:0.5 delay:0.0 options:(UIViewAnimationOptionCurveLinear & UIViewAnimationOptionBeginFromCurrentState) animations:^{
myImageView.layer.position = CGPointMake( myImageView.layer.position.x, mouse.layer.position.y - 40);
}completion:^(BOOL complete){
//
}];
}
}
Если вы используете это, вы должны быть в состоянии указать окончательный x
и y
координаты, которые вы хотите, и анимация продолжаются от точки, в которой был затронут объект, до этого положения.