【问题标题】:Clicking an animating image / button单击动画图像/按钮
【发布时间】:2013-12-25 03:58:54
【问题描述】:

我为此寻找了一个解决方案,但我无处可去。

我想开发一个 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 而不是 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(即使它会继续移动)时撞到云,应用程序就会崩溃。如果我在它移动时击中它,它会发出声音和动画。

有人对这是为什么有任何建议吗?

【问题讨论】:

标签: ios animation uibutton


【解决方案1】:

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

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

我在 github 上有一个示例项目,该项目展示了当您使用 CABasicAnimation 制作 UIView 动画和 Core Animation 时如何执行此操作(它动画层,而不是视图。)

Core Animation demo with hit testing

【讨论】:

    【解决方案2】:

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

    但是,可以绕过该问题。您需要捕获触摸事件并与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 的 visual 位置的信息。

    【讨论】:

    • 嘿这类作品,我已将我的动画添加到“//做某事”空间,现在当云移动时,我可以点击它并播放声音 - 太棒了。但是,当我单击终点时,我得到一个“以 NSException 类型的未捕获异常终止”并且应用程序关闭。这显然是我正在做的事情,但有什么想法吗?
    • 感谢您的凝胶 Tiago,我发现了问题,if 语句有效,但我仍然为情节提要中的按钮分配了云 Animation_clicked 的 IBAction。我删除了它,它不再崩溃。再次感谢大家 - 得到它去我想要的。
    • 我删除了我的评论,以专注于重要的事情。我很高兴你做到了:)。没问题@DanDavies。如果有人已经知道这些技巧,那就更容易了。随时返回 StackOverflow。
    【解决方案3】:

    您可能还想使用UIViewAnimationOptionAllowUserInteraction

    【讨论】:

    • 谢谢,但这也没有用。这就是它所做的只是让我在动画停止后按下按钮,不允许我在动画移动时点击所以不知道为什么。
    猜你喜欢
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多