我有两个视图控制器 - 一个是主菜单,另一个是游戏。游戏中有一个下降的盒子,如果用户没有抓住它,它会从屏幕上掉下来并重置在顶部的原始位置。
应用程序加载到主菜单上,第一次去玩,它完美地运行。我可以毫无问题地打出尽可能多的回合。但是,如果我返回主菜单(模态segue)然后返回游戏,一旦我再次尝试启动动画,它就会给我一个错误,说明该框"应该是一个后代UIDynamicAnimator中的参考视图"。我已在下面列出了此特定部分的代码。
我已经搜索了几个小时,无法弄清楚为什么会这样。我可以完全刷新视图控制器,使其工作方式与第一次相同吗?我应该在UIDynamicAnimator中更改我的referenceview参数吗?我不知所措。有人请帮忙!!
_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
_gravity = [[UIGravityBehavior alloc] initWithItems:@[box]];
[_animator addBehavior:_gravity];
(我应该提到上面的代码是在IBAction中,但我也尝试在viewDidLoad
中添加它并且它没有帮助......)
此外,我收到的官方错误是
由于未捕获的异常而终止应用 ' NSInvalidArgumentException',原因: '查看项目(UIImageView: 0x7ffb11d9efd0; frame =(75 40; 70 70); hidden = YES; autoresize = RM + BM; userInteractionEnabled = NO; layer = CALayer:0x7ffb11d9faa0) 应该是参考视图的后代 UIDynamicAnimator:0x7ffb11da8120(0.000000s)in UIView:0x7ffb11da84c0 {{0,0},{375, 667}}
以下是与初始化" box":
有关的所有代码-(void)viewDidLoad {
box = [[UIView alloc] initWithFrame:CGRectMake(75, 40, 70, 70)];
box.backgroundColor = [UIColor blackColor];
}
-(IBAction)rebounce:(id)sender{
[self.view addSubview:box];
box.frame = CGRectMake(75, 40, 70, 70);
box.hidden = NO;
_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view ];
_gravity = [[UIGravityBehavior alloc] initWithItems:@[box]];
[_animator addBehavior:_gravity];
[self newBarrierCollision];
_collision = [[UICollisionBehavior alloc] initWithItems:@[box]];
_collision.collisionDelegate = self;
_collision.action = ^{
NSLog(@"%@, %@",
NSStringFromCGAffineTransform(box.transform),
NSStringFromCGPoint(box.center));
};
UIDynamicItemBehavior* itemBehaviour = [[UIDynamicItemBehavior alloc] initWithItems:@[box]];
itemBehaviour.elasticity = 0.6;
[_animator addBehavior:itemBehaviour];
timer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(CheckIfOffscreen) userInfo:nil repeats:YES];
}
-(void)CheckIfOffscreen{
if(box.center.y > SH){
[timer invalidate];
[_animator removeAllBehaviors];
box.frame = CGRectMake(75, 40, 70, 70);
}
基本上,盒子掉落,向下旋转,如果它从屏幕上掉下来,动画就会停止,盒子会在它顶部的原始位置被替换,直到用户再次按下按钮。
*****编辑:我有更多可能有用的信息。当我玩游戏时,返回主菜单,然后再次返回,以编程方式对该框执行任何操作会导致应用程序崩溃。我尝试在ViewDidLoad中添加一个标记,这导致它崩溃。它必须与盒子有关,但我无法弄清楚是什么。
答案 0 :(得分:0)
从错误消息中,我可以推断出这一行会导致问题:
_gravity = [[UIGravityBehavior alloc] initWithItems:@[box]];
您在UIDynamicBehavior
子类中使用的每个项目都必须是参考视图的子视图,您在初始化UIDynamicAnimator
时将其作为参数传递:
_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
因此,box
必须是self.view
的子视图,但是当您返回游戏控制器时则不是。{{1}}。