单击动画图像/按钮

时间:2013-12-07 21:35:52

标签: ios animation uibutton

为了解决这个问题,我看起来很高很低,而且我无处可去。

我想开发一款iOS应用程序,它只是一个简单的点击,动画和播放声音。

所以我有一张说农场的地图,当我点击羊时,它会产生动画并产生一些噪音。我已经成功实现了这一点并且一切顺利。

我的问题和疑问是能够点击已经设置动画的按钮。

所以当视图加载时我希望云按钮在天空中从左向右移动,我再次使用此代码实现了这一点

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidLoad];


    [UIView animateWithDuration:8.5
                          delay:1.0
                        options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         cloudAnimate.center = CGPointMake(-100.0, 100.0);
                     }
                     completion:NULL];
}

但是,当按钮从左到右动画时,它们不可点击,所以我想要旋转云和播放声音的触摸不起作用。我已经阅读了一些其他帖子,说这不能做,但我的iPhone和iPad上有大量的应用程序这样做,所以任何人都知道如何实现这一目标?

任何帮助都会非常感激,因为我正在拔头发。

提前致谢。

修改

好的,所以感谢下面的答案组合,我几乎得到了这个工作

所以我用它来设置初始的CGPoint:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Move UIView

    cloudAnimate.center = CGPointMake(400.0, 100.0);
}

要从左到右为云设置动画,我使用与原来相同的代码进行轻微调整:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidLoad];


    [UIView animateWithDuration:8.5
                          delay:1.0
                        options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
                     animations:^{
                         cloudAnimate.center = CGPointMake(100.0, 100.0);
                     }
                     completion:NULL];

}

而不是IBAction我正在使用它:

-(void) touchesBegan:(NSSet*) touches withEvent:(UIEvent *) event {

    CGPoint point = [[touches anyObject] locationInView:self.view];

    if([self.cloudAnimate.layer.presentationLayer hitTest:point]) {

        SystemSoundID soundID;
        NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"Super_Mario_Bros_Mushroom" ofType:@"mp3"];

        AudioServicesCreateSystemSoundID((__bridge CFURLRef) [NSURL fileURLWithPath:soundFile], & soundID);
        AudioServicesPlaySystemSound(soundID);

        cloudAnimate.imageView.animationImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"panda-png-chewing"],[UIImage imageNamed:@"panda-png-happy"],nil];

        cloudAnimate.imageView.animationDuration = 0.2;
        cloudAnimate.imageView.animationRepeatCount = 6;
        [cloudAnimate.imageView startAnimating];
    }
}

所以现在它几乎完全符合我的要求,但如果你在完成CGPoint时遇到云端(即使它会继续移动)应用程序崩溃。如果我在它移动时击中它会产生声音和动画。

任何人都有任何建议,为什么会这样?

3 个答案:

答案 0 :(得分:3)

为视图设置动画时,将视图设置为最终状态。这样,您只能检测动画最终位置的触摸。

但是,可以解决这个问题。你需要抓住触摸事件并与presentationLayer进行比较。

-(void) touchesBegan:(NSSet*) touches withEvent:(UIEvent *) event {

    CGPoint point = [[touches anyObject] locationInView:self.view];

   if([self.cloudAnimate.layer.presentationLayer hitTest:point]) {

     //do something
   }
}

表示层包含有关与您的cloudAnimate关联的CALayer的可视位置的信息。

答案 1 :(得分:2)

您可能也想使用UIViewAnimationOptionAllowUserInteraction

答案 2 :(得分:0)

简短的回答是,您无法在动画制作时点按视图。原因是视图实际上并不从开始到结束位置。相反,系统使用Core Animation中的“表示层”来创建视图对象移动/旋转/缩放/外观的外观。

你需要做的是将一个水龙头手势识别器附加到一个完全包围动画(可能是整个屏幕)的包含视图,然后编写查看水龙头坐标的代码,进行坐标转换,并决定是否点按您关注的视图。如果按钮位于某个按钮上,并且您希望该按钮突出显示您还需要处理该逻辑。

我在github上有一个示例项目,它展示了当你使用CABasicAnimation进行UIView动画和核心动画时它是如何做到这一点的(动画层是动画,而不是视图。)

Core Animation demo with hit testing