Можно ли успешно оживить движущуюся UIButton? - PullRequest
2 голосов
/ 25 августа 2010

Я пытаюсь анимировать кнопку, которая перемещается по экрану.В любой момент пользователь может нажать на кнопку.Но кнопка не реагирует на прикосновения.Я пробовал анимационный блок, но кнопка просто перемещается сразу к его конечным координатам, в то время как кадр показывает анимацию (кнопка называется пузырьком):

[UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:5.0];
    CGAffineTransform newTransform = CGAffineTransformMakeScale(3, 3);
    bubble.transform = CGAffineTransformTranslate(newTransform, 0, -460);
    [UIView commitAnimations];

Итак, я попробовал Core Animation с помощьюпримера кода (путь не важен, это всего лишь пример):

CGMutablePathRef thePath = CGPathCreateMutable();
    CGPathMoveToPoint(thePath,NULL,15.0f,15.f);
    CGPathAddCurveToPoint(thePath,NULL,
                          15.f,250.0f,
                          295.0f,250.0f,
                          295.0f,15.0f);
    CAKeyframeAnimation *theAnimation=[CAKeyframeAnimation animationWithKeyPath:@"position"];
    theAnimation.path=thePath;
    CAAnimationGroup *theGroup = [CAAnimationGroup animation];
    theGroup.animations=[NSArray arrayWithObject:theAnimation];
    theGroup.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    theGroup.duration=15.0;
    CFRelease(thePath);
    [bubble.layer addAnimation:theGroup forKey:@"animatePosition"];

Но кнопки по-прежнему не реагируют на прикосновения.Кстати, у меня есть несколько таких «пузырьковых» кнопок на экране одновременно, поэтому одновременное использование нескольких NSTimers не будет оптимальным.

Кто-нибудь может предложить другой подход?Должен ли я, возможно, анимировать UIImageViews и заставить их отвечать на прикосновения?Или у меня будет такая же проблема?Это озадачивало меня в течение нескольких дней, поэтому любая помощь очень ценится.

Спасибо :)

Майкл

Ответы [ 4 ]

3 голосов
/ 02 сентября 2010

Ну, для всех, вот мое решение, которое отлично работает:

- (void)startMinigame {
    makeBubbles = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(generateRandomBubble) userInfo:nil repeats:YES];
    floatBubbles = [NSTimer scheduledTimerWithTimeInterval:1.0/60.0 target:self selector:@selector(floatBubbles) userInfo:nil repeats:YES];
}

- (void)generateRandomBubble {
    //Get a random image for the bubble
    int randomIndex = arc4random()%kNumberBubbles;
    UIImage *bubbleImage = [bubbleImages objectAtIndex:randomIndex];

    //Create a new bubble object and retrieve the UIButton
    Bubble *bubble = [[Bubble alloc]initWithImage:bubbleImage andIndex:randomIndex];
    UIButton *bubbleButton = bubble.bubbleButton;

    //Configure the button
    [bubbleButton addTarget:self action:@selector(bubbleBurst:) forControlEvents:UIControlEventTouchDown];

    //Add the bubble to the scene
    [self.view insertSubview:bubbleButton belowSubview:bathTub];
    //Add the bubble to an array of currently active bubbles:
    [self.bubbles addObject:bubble];
    [bubble release];
}

- (void)floatBubbles {
    //Move every active bubble's frame according to its speed. 
    for (int i = 0; i < [bubbles count]; ++i) {
        Bubble *bubble = [bubbles objectAtIndex:i];
        int bubbleSpeed = bubble.speed;
        CGRect oldFrame = bubble.bubbleButton.frame;
        CGRect newFrame = CGRectMake(oldFrame.origin.x, oldFrame.origin.y - bubbleSpeed, oldFrame.size.width+0.1, oldFrame.size.height+0.1);
        bubble.bubbleButton.frame = newFrame;
        if (bubble.bubbleButton.frame.origin.y < -100.0) {
            [bubbles removeObject:bubble];
            [bubble.bubbleButton removeFromSuperview];
        }
    }
}
3 голосов
/ 27 августа 2010

При анимации элемента GUI, такого как UIButton, фактическая позиция изменяется только после завершения анимации. Это означает, что любые сенсорные события во время анимации будут работать только в начальной точке кнопки. Вы можете получить текущую отображаемую позицию кнопки, открыв ее презентацию. Возможно, вам потребуется реализовать собственную обработку событий, посмотреть на положение, когда пользователь касается экрана, и сравнить его с границами, которые вы получаете от presentationLayer.

1 голос
/ 27 августа 2010

Это звучит слишком сложно для UIKit и CoreAnimation.Кажется, вы разрабатываете что-то вроде игры.Почему бы не использовать глобальный таймер анимации, скажем, ~ 60 кадров в секунду и рисовать в Quartz2D?Затем для каждого прикосновения вы можете быстро проверить любые попадания между кварцевыми обновлениями.

1 голос
/ 25 августа 2010

Попробуйте анимировать свойство frame в uiview.

...