Вопрос

У меня есть объект, который перемещается справа налево по экрану:

[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 координаты, которые вы хотите, и анимация продолжаются от точки, в которой был затронут объект, до этого положения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top