为了解决这个问题,我看起来很高很低,而且我无处可去。
我想开发一款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时遇到云端(即使它会继续移动)应用程序崩溃。如果我在它移动时击中它会产生声音和动画。
任何人都有任何建议,为什么会这样?
答案 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动画和核心动画时它是如何做到这一点的(动画层是动画,而不是视图。)