大家好我是法国人因为我的英语而烦恼。我的问题如下:我在屏幕中央有一个名为viewToRotate的图像,然后我有一个名为flakeView的图像,它是在屏幕外创建的然后它移动到中心,每秒钟Timer都会这样做(在屏幕外创建一个flakeView,然后将其移动到屏幕中心)。
我想要做的是:如果flakeView和viewToRotate碰撞,则将viewToRotate的alpha减少到0.5。但是当屏幕上出现flakeView时,调用减少alpha的动作而没有viewToRotate和flakeView的碰撞,因此它们会在触摸之前发生碰撞。我不知道为什么。我该怎么解决这个问题呢。这是代码:
UIImageView* flakeView = [[[UIImageView alloc] initWithImage:flakeImage] autorelease];
// use the random() function to randomize up our flake attributes
int startY = round(random() % 320);
// set the flake start position
flakeView.center = CGPointMake(490, startY);
flakeView.alpha = 1;
// put the flake in our main view
[self.view addSubview:flakeView];
[UIView animateWithDuration:7
animations:^{
// set the postion where flake will move to
flakeView.center = viewToRotate.center;
}];
}
-(void)checkCollision{
if(CGRectIntersectsRect(flakeView.frame, viewToRotate.frame) == 1)
{
viewToRotate.alpha=0.5;
}
}
答案 0 :(得分:0)
我不建议在viewDidLoad上使用计时器。我相信你应该把计时器设置为其他功能。即使你不使用viewDidLoad也是如此。
另一件事是UIView动画。即使您每60fps有一个计时器,动画也不会更改动画对象的属性。因此,在创建动画之前,您需要设置一次这些属性。当您创建动画时,您第二次设置相同的属性。就是这样。从现在开始,如果您对属性进行检查,则动画正在运行时,您将始终获得第二个值。
要有一个工作代码,一个选项是在特定时间间隔为每个步骤创建UIView动画(并执行属性检查)。或者使用OpenGL。
答案 1 :(得分:0)
在深入研究此问题之前,请确保viewToRotate.frame
的实际大小与预期相符(请参阅我的评论)。
一旦确定了这些属性,您可能需要检查动画对象的当前presentationLayer
上的碰撞,而不是原始状态。
<强> UIView.layer.presentationLayer 强>
返回的副本 包含所有属性的图层 他们是在当前的开始 交易,任何活跃的 动画应用。
所以你可能会像这样适应你的碰撞检测:
-(void)checkCollision
{
if(CGRectIntersectsRect(flakeView.layer.presentationLayer.frame, viewToRotate.layer.presentationLayer.frame) == 1)
{
viewToRotate.alpha=0.5;
}
}
还可以考虑使用CoreAnimation Layer方法hitTest:
而不是手工碰撞检测。
hitTest:
返回最远的 接收器的后代 层次结构(包括其自身) 包含指定点。
答案 2 :(得分:0)
以下是您要检查的内容。